2012-02-17 2 views
2

У меня есть преобразование XSL, где я использовал для запроса строки, которая так:Как перевести полный документ на нижний регистр перед применением любых других шаблонов?

<xsl:value-of select="/input/as/a[@id=$id]/CaMeL[@id2=$id2]/@interest"/> 

Теперь, когда это случилось, что CaMeL (в формате XML) должен быть переименован в cAmEl. Хорошо. Простое преобразование дела в мое преобразование немедленно сработало, но я бы потерял обратно совместимость.

Поиск по SO, я нашел это: XSLT Stylesheet: Changing text to upper case

accepted answer выглядит многообещающим, но я в настоящее время застрял на том, как заполнить параметр doc, используемый в ответе.

Как я могу добавить шаг перевода в существующем <xsl:template match="/">, который переводит весь документ в нижний регистр до того, как будут применены другие шаблоны?

ответ

3

Возможно, это может помочь. Но я не проверял. Не могли бы вы предоставить пример XML?

<xsl:value-of select="/input/as/a[@id=$id]/*[translate(local-name(),'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')='camel' and @id2=$id2]/@interest"/> 

EDIT

Если вы хотите изменить весь файл XML в нижний регистр (без элементов и значений атрибутов, конечно), вы можете использовать этот следующий шаблон:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="*"> 
    <xsl:element name="{translate(name(),'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 
             'abcdefghijklmnopqrstuvwxyz')}"> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:element> 
    </xsl:template> 

</xsl:stylesheet> 

Имея сделать преобразование в нижний регистр, вы можете попытаться создать многопроходную XSLT-преформацию - следующий проход будет вашим преобразованием. Однако я не уверен, как это сделать, используя XSLT 1.0.

EDIT 2

ОК, так что здесь идет весь пример. У меня не было ваших примеров, поэтому я работал над своими.

Пример входного файла:

<?xml version="1.0" encoding="UTF-8"?> 
<Root> 
<baba>aaa</baba> 
<Baba>BBB</Baba> 
</Root> 

XSLT с сортировкой многоходовых:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:variable name="firstPassResult"> 
     <xsl:apply-templates select="/" mode="firstPass"/> 
    </xsl:variable> 
    <xsl:template match="@*|node()" mode="firstPass"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="*" mode="firstPass"> 
     <xsl:element name="{translate(name(),'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 
             'abcdefghijklmnopqrstuvwxyz')}"> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:element> 
    </xsl:template> 
    <xsl:template match="/"> 
     <xsl:apply-templates select="$firstPassResult" mode="secondPass"/> 
    </xsl:template> 
    <xsl:template match="//baba" mode="secondPass"> 
     <xsl:value-of select="text()"/> 
    </xsl:template> 
</xsl:stylesheet> 

I работает под Altova XMLSpy отладчик. Выход:

<?xml version="1.0" encoding="UTF-8"?>aaaBBB 
+0

multi-pass? звучит интересно. скажите мне больше :-) как мне это сделать? – eckes

+0

@eckes: see my edit – Lukasz

+0

Отлично! Я использовал XSL с годами, но никогда не использовал ** режим **. Спасибо! – eckes

 Смежные вопросы

  • Нет связанных вопросов^_^