使用与答案found in this question类似的东西,我将基于函数的函数放在一起,以创建一个加载到变量中的XML结果树片段。
我能够转换此XML
<Summary> <Summary>
<Category>
<Category>Tuition and Fees</Category>
<TotalDebits>0.00</TotalDebits>
<TotalCredits>-3509.45</TotalCredits>
</Category>
<Category>
<Category>Miscellaneous</Category>
<TotalDebits>60.62</TotalDebits>
<TotalCredits>-234.36</TotalCredits>
</Category>
</Summary>
</Summary>
到这个
<Summary>
<Category>
<Category>Tuition and Fees</Category>
<TotalDebits>0.00</TotalDebits>
<TotalCredits>-3509.45</TotalCredits>
</Category>
<Category>
<Category>Miscellaneous</Category>
<TotalDebits>60.62</TotalDebits>
<TotalCredits>-234.36</TotalCredits>
</Category>
</Summary>
包含在此变量
中 <xsl:variable name="SummaryItems">
<xsl:call-template name="TheGreatUnescape">
<xsl:with-param name="escaped" select="string(//Summary)" />
</xsl:call-template>
</xsl:variable>
现在我的问题是我正在尝试使用exslt:node-set()
来访问此变量中的节点,但我没有得到任何信息。
使用
等功能时<xsl:for-each select="exslt:node-set($SummaryItems)/Summary/Category">
它不会产生任何结果。
我确实在xmlns:exslt="http://exslt.org/common"
中包含了xsl:stylesheet
声明,并且我已经测试了node-set
函数,因此我知道它不适用于变量中转换的XML。
我是否使用exslt:node-set
可以访问的代码创建了真实结果树片段?
答案 0 :(得分:3)
事情不匹配的最常见原因是它们不在您期望的命名空间中,很难说因为您没有显示完整代码但是分阶段工作
你说
<xsl:copy-of select="exslt:node-set($SummaryItems)"/>
有效,请尝试
<xsl:copy-of select="exslt:node-set($SummaryItems)/*"/>
如果有效,请尝试
<xsl:copy-of select="exslt:node-set($SummaryItems)/Summary"/>
如果这不起作用,则Summary
未选择<Summary>
,其中100次中有99次是命名空间问题。
原始答案(已解决)
<xsl:for-each select="exslt:node-set($SummaryItems)\Summary\Category">
应该给出错误路径分隔符的XPath语法错误
<xsl:for-each select="exslt:node-set($SummaryItems)/Summary/Category">
答案 1 :(得分:2)
David Carlisle说对,命名空间问题可能是事情与预期不匹配的最常见原因。
节点集问题的第二个常见问题(至少,它经常发生在我身上)是关于哪些节点由绑定到节点集的变量名表示的暂时混淆。详细信息将根据绑定的确切方式而有所不同,但根据您的说法,$SummaryItems
似乎可能绑定到包含两个Summary
元素的Category
元素(等) - 如果那么,表达式exslt:node-set($SummaryItems)/Summary/Category
将不会产生任何结果,因为$SummaryItems
不包含Summary
元素。您想要的Summary
元素不是$SummaryItems
中节点的子元素 - 它们 $SummaryItems
中的节点。
在这种情况下,我会尝试exslt:node-set($SummaryItems)/Category
。
在更一般的情况下,当我遇到这样的麻烦时,我会运行测试代码以找出我的位置:例如name(exslt:node-set($SummaryItems)[1])
会返回什么?