Как перевести полный документ в нижний регистр перед применением любых других шаблонов? - PullRequest
2 голосов
/ 17 февраля 2012

У меня есть XSL-преобразование, где я использовал запрос строки таким образом:

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

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

Поиск в SO, я нашел это: Таблица стилей XSLT: Изменение текста в верхний регистр

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

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

1 Ответ

3 голосов
/ 17 февраля 2012

Может быть, это может помочь. Но я не проверял это. Не могли бы вы предоставить образец 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.

РЕДАКТИРОВАТЬ 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>

Я работаю под отладчиком Altova XMLSpy. Выход:

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