2013-09-24 2 views
0

Я пытаюсь создать временный документ, содержащий некоторые данные, поэтому у меня его нет на всем протяжении xsl-файла. Я пытаюсь выполнить эти данные следующим образом:Итерация по временному документу с использованием xslt

<xsl:variable name="stuff"> 
    <foo name="bar" key="83"/> 
    <foo name="baz" key="73"/> 
    <foo name="qux" key="71"/> 
    <foo name="quux" key="72"/> 
</xsl:variable> 

<xsl:for-each select="$stuff/foo" > 
    <xsl:value-of select="@key" /> 
</xsl:for-each> 

Каждый блок никогда не вводится. Я попытался воспроизвести описанный метод here. Я также изучил использование node-set(), но насколько я могу сказать, что эта функция требуется только для XSLT версии 1.0?

+0

Фрагмент, который вы опубликовали, отлично выглядит для меня, предполагая, что XSLT 2.0-процессор, такой как Saxon 9, AltovaXML, XmlPrime. Если у вас по-прежнему возникают проблемы, попробуйте рассказать нам о деталях окружающей среды и предоставить минимальные, но полные образцы, позволяющие нам воспроизвести проблему. –

+0

Я попытался воспроизвести свои проблемы с использованием последней версии Saxon в командной строке, и оба этих подхода работают очень хорошо. По крайней мере, теперь я уверен, что ошибка не в файле xsl. – expez

ответ

0

Tim C дал полный ответ об этом в следующей ветке: Use a xsl:for-each over an xml to decide which label-value pairs are displayed?. Я предлагаю вам взглянуть на него.

В основном для XSLT 2.0 вы можете включить XML, который вы ввели в настоящее время в <xsl:variable> непосредственно в XSLT:

<my:stuff> 
    <foo name="bar" key="83"/> 
    <foo name="baz" key="73"/> 
    <foo name="qux" key="71"/> 
    <foo name="quux" key="72"/> 
</my:stuff> 

Затем в XSLT, где это необходимо объявить переменную:

<xsl:variable name="stuff" select="document('')/*/my:stuff" /> 

Таким образом, XSLT будет примерно таким:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:my="my" exclude-result-prefixes="my"> 
    <my:stuff> 
     <foo name="bar" key="83"/> 
     <foo name="baz" key="73"/> 
     <foo name="qux" key="71"/> 
     <foo name="quux" key="72"/> 
    </my:stuff> 

    <xsl:template match="/"> 
     <xsl:variable name="stuff" select="document('')/*/my:stuff"/> 
      <xsl:for-each select="$stuff/foo"> 
       <xsl:value-of select="@key" /> 
      </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Я получаю сообщение об ошибке в этой строке: '' – expez

+0

Он отлично работает, когда я пытаюсь использовать его в [xsltcake] (http://www.xsltcake.com/), но не там, где мне это нужно. Процессор xslt, который я использую, - это саксон, если это важно? – expez

+0

@expez: К сожалению, я не знаком со всеми различиями между XSLT-процессорами. Надеюсь, кто-то другой мог бы ответить на этот вопрос. –

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