如何在遍历节点集时引用源XML?

mic*_*57k 2 xml xslt xpath node-set

我有以下XSLT样式表(简化):

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

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:variable name="categories">
    <category name="one"/>
    <category name="two"/>
    <category name="three"/>
</xsl:variable>

<xsl:template match="/">
<result>

<xsl:for-each select="exsl:node-set($categories)/category">
<xsl:element name="{@name}">

<!-- THIS IS THE PROBLEMATIC PART -->
    <xsl:for-each select="/input/object">
        <item>
            <xsl:value-of select="."/>
        </item>
    </xsl:for-each>

</xsl:element>
</xsl:for-each>
</result>
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

这是指以下源XML文档(也简化):

<?xml version="1.0" encoding="utf-8"?>
<input>
    <object category="one">a</object>
    <object category="one">b</object>
    <object category="two">c</object>
    <object category="one">d</object>
    <object category="three">e</object>
</input>
Run Code Online (Sandbox Code Playgroud)

对源文档的引用不会产生任何结果; 输出只是空元素,每个类别一个:

<?xml version="1.0" encoding="UTF-8"?>
<result>
  <one/>
  <two/>
  <three/>
</result>
Run Code Online (Sandbox Code Playgroud)

如何使用源文档中的项目"填充"元素?


只是为了澄清,使用不同的方法已经解决了这背后的"真正"问题.我只是想了解为什么这种方法不起作用.

hal*_*bit 5

xsl:for-eachXPath中,在所选"文档"的上下文中解释,/即指node-set($categories).您可以通过尝试以下代码自己查看:

<xsl:template match="/">
  <xsl:variable name="root" select="/"/>
  <result>

  <xsl:for-each select="exsl:node-set($categories)/category">
    <xsl:element name="{@name}">

    <xsl:for-each select="$root/input/object">
        <item>
            <xsl:value-of select="."/>
        </item>
    </xsl:for-each>

    </xsl:element>
  </xsl:for-each>
  </result>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)

它使用该变量root将模板选择的文档访问权限传递给内部xsl:for-each循环.(注意:变量也可以放在模板之外.)

您可以通过在原始代码中/替换select="/input/object"来仔细检查实际使用节点集select="/category".您将在元素中获得空项(每个类别一个).

  • 好吧,那好吧.我已经做了一些搜索(因为你已经指出这里的_real_问题正在返回调用文档,我可以将搜索重点放在那里)我发现将根存储在变量中是常见的建议 - 所以我想我会不再担心它.再次感谢你,这是一种乐趣. (3认同)