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)
如何使用源文档中的项目"填充"元素?
只是为了澄清,使用不同的方法已经解决了这背后的"真正"问题.我只是想了解为什么这种方法不起作用.
在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".您将在元素中获得空项(每个类别一个).
| 归档时间: |
|
| 查看次数: |
530 次 |
| 最近记录: |