Набор узлов xslt 1.0 не зацикливается - PullRequest
0 голосов
/ 05 октября 2018

У меня есть xsl:variable, который содержит список узлов.Когда я пытаюсь перебрать их для каждого, я не получаю результатов.Я использую saxon655 и java 1.8.0_181.

Вот xslt:

  <?xml version="1.0"?>
  <xsl:stylesheet xmlns="http://www.w3.org/1999/xhtml"
                  xmlns:exsl="http://exslt.org/common"
                  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                  exclude-result-prefixes="exsl"
                  version="1.0">

    <xsl:variable name="products">
        <array>
        <item><name>Scooby</name><value>Doo</value></item>
        <item><name>snack</name><value>cookies</value></item>
        </array>
    </xsl:variable>

      <xsl:template match="/">
        <xsl:for-each select="exsl:node-set($products)">
          <xsl:message>LOOP</xsl:message>
          <xsl:value-of select=".//name" />
        </xsl:for-each>
      </xsl:template>

  </xsl:stylesheet>

xml:

<?xml version='1.0' encoding='UTF-8'?>
<book>
   text
</book>

Наконец, моя команда:

/usr/bin/java -cp /usr/local/share/saxon/saxon.jar com.icl.saxon.StyleSheet test.xml test_run.xsl

Когда я запускаю команду, я получаю одну строку вывода LOOP.

Я ожидал получить сообщение и значение для name один раз для каждого элемента в массиве переменных.

1 Ответ

0 голосов
/ 05 октября 2018

Doing exsl:node-set($products) возвращает один узел документа, который содержит остальную часть XML в вашей переменной, так что вам нужно сделать это ...

<xsl:for-each select="exsl:node-set($products)/array/item">

Однако это не будетработать сразу, потому что вы определили объявление пространства имен по умолчанию в вашем XSLT (xmlns="http://www.w3.org/1999/xhtml").Это означает, что элементы в переменной, не имеющие префикса, будут находиться в этом пространстве имен.

Так что, если у вас нет причины иметь array и item в пространстве имен, объявите переменную следующим образом:

<xsl:variable name="products" xmlns="">

Попробуйте это XSLT

<xsl:stylesheet xmlns="http://www.w3.org/1999/xhtml"
              xmlns:exsl="http://exslt.org/common"
              xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
              exclude-result-prefixes="exsl"
              version="1.0">

  <xsl:variable name="products" xmlns="">
    <array>
    <item><name>Scooby</name><value>Doo</value></item>
    <item><name>snack</name><value>cookies</value></item>
    </array>
  </xsl:variable>

  <xsl:template match="/">
    <xsl:for-each select="exsl:node-set($products)/array/item">
      <xsl:value-of select="name" />
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

В качестве альтернативы, если вам нужно указать array и item в пространстве имен, вы можете обработать их следующим образом:

<xsl:stylesheet xmlns="http://www.w3.org/1999/xhtml"
                xmlns:xhtml="http://www.w3.org/1999/xhtml"
                  xmlns:exsl="http://exslt.org/common"
                  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                  exclude-result-prefixes="exsl"
                  version="1.0">

    <xsl:variable name="products">
      <array>
        <item><name>Scooby</name><value>Doo</value></item>
        <item><name>snack</name><value>cookies</value></item>
      </array>
    </xsl:variable>

    <xsl:template match="/">
      <xsl:for-each select="exsl:node-set($products)/xhtml:array/xhtml:item">
        <xsl:value-of select="xhtml:name" />
      </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>
...