2016-06-29 4 views
0

Я пытаюсь использовать XSLT 2.0, однако тег <xsl:value-of select=...> больше не дает мне первый элемент. Я получаю все значения в XML. Как преобразовать следующий XSLT для работы с XSLT 2.0?Преобразование из XSLT 1.0 в 2.0 не дает первого текста из тега

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

    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="Data"> 
     <xsl:apply-templates/> 
    </xsl:template> 

    <xsl:template match="Data/ABC"> 
     <xsl:for-each select="."> 
      <Data xmlns="example.com"> 
       <GEF> 
        <id><xsl:value-of select="id"/></id> 
        <time><xsl:value-of select="time"/></time> 
        <type>test</type> 
       </GEF> 
      </Data> 
     </xsl:for-each> 
    </xsl:template> 

</xsl:stylesheet> 

Если у меня был этот XML:

<Data xmlns="example.com"> 
    <ABC> 
     <id>2</id> 
     <time>125622</time> 
    </ABC> 
</Data> 

Если я использую XSLT 1.0, я хотел бы получить это:

<Data xmlns="example.com"> 
    <GEF> 
     <id>2</id> 
     <time>125622</time> 
     <type>test</type> 
    </GEF> 
</Data> 

Обычно, я хотел бы получить 2 и 125622 в виде отдельных элементов для каждого тега в XSLT. Однако теперь он просто получает оба значения и выводит их. Он даже не печатает теги после преобразования. Что я могу использовать в 2.0? Мои поиски ничего не принесли.

Это то, что я получаю с 2,0:

<Data xmlns="example.com"> 

    2 
    125622 
    test 

</Data> 
+0

Какой результат вы хотите получить? - И почему у вас есть '', но нет шаблонов в этом режиме? –

+0

«Теперь он просто получает оба значения и выводит их. Он даже не печатает теги после преобразования» звучит так, как если бы элементы входного XML находились в пространстве имен, и поэтому ваши шаблоны не применяются. Есть ли 'xmlns =" ​​... "' в элементе 'Data' или предке? –

+2

Ваш второй шаблон должен соответствовать 'match =" ABC "'. Поскольку вы переопределяете совпадение, применяются только правила преобразования по умолчанию, а именно, чтобы испускать только текст элементов. Удалите 'Data /', и он должен работать. –

ответ

1

XSLT и XPath (1,0 в более поздних версиях) работают с моделью осведомленные данных имен, поэтому данный <Data xmlns="example.com">Data элемент и его потомки находятся в пространстве имен example.com и ваш XSLT должен учитывать это. В XSLT 2.0 вы можете сделать это с

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xpath-default-namespace="example.com"> 

Что касается кода Java, убедитесь, что вы используете namespace aware DocumentBuilderFactory.

+0

Спасибо. Я как бы получаю вывод, который хочу. Теперь он печатает, как это должно быть. Однако при последнем '' он также выводит все текстовые значения. Кроме того, '' больше не работает (отлично работает с 1.0). Любая идея о том, почему это может быть? вы очень нуждаетесь в помощи! – syy

+0

Что касается текстовых значений, напечатанных также, я бы ожидал, что это произойдет для первой версии кода, который использовал режим, но не имел явного шаблона в этом режиме. Я думаю, вы должны задать новый вопрос: 'конечно выглядит неправильно и ему нужно будет' '. Но относительные URI могут быть проблемой, задайте новый вопрос со всеми необходимыми сведениями о XSLT и Java-коде. –

+0

У меня есть шаблоны, определенные для режимов, перечисленных мной в мой XSLT.Таким образом, нет режима, который не используется. Это из-за этой строки: '\t \t ' Мысль, которая была использована для шаблонов th у нет режимов. И я задам новый вопрос по другой проблеме. – syy

2

Один из способов заставить ваш код работать под XSLT 2.0 - запустить его в режиме обратной совместимости, который вы можете сделать просто, оставив номер версии в виде версии = «1.0». Если вы знаете, что зависимость от XSLT 1.0 семантики применимы только к определенным частям таблицы стилей, то вы можете сделать это выборочно, например

  <xsl:for-each select="." version="1.0"> 
      <Data xmlns="example.com"> 
       <GEF> 
        <id><xsl:value-of select="id"/></id> 
        <time><xsl:value-of select="time"/></time> 
        <type>test</type> 
       </GEF> 
      </Data> 
     </xsl:for-each> 

Если вы можете, хотя, это лучше всего, чтобы преобразовать код для работы с 2.0 путь. Если вы только хотите, xsl:value-of инструкции для обработки первого элемента в наборе узлов, просто добавьте [1], чтобы выбрать первый пункт, например

<id><xsl:value-of select="id[1]"/></id> 
+0

Спасибо! Приятно знать, что я тоже могу это сделать. – syy