在转换的解析XML上使用exslt:node-set()

时间:2013-01-18 20:58:38

标签: xml xslt exslt

使用与答案found in this question类似的东西,我将基于函数的函数放在一起,以创建一个加载到变量中的XML结果树片段。

我能够转换此XML

  <Summary> &lt;Summary&gt;&#xD;
        &lt;Category&gt;&#xD;
            &lt;Category&gt;Tuition and Fees&lt;/Category&gt;&#xD;
            &lt;TotalDebits&gt;0.00&lt;/TotalDebits&gt;&#xD;
            &lt;TotalCredits&gt;-3509.45&lt;/TotalCredits&gt;&#xD;
        &lt;/Category&gt;&#xD;
        &lt;Category&gt;&#xD;
            &lt;Category&gt;Miscellaneous&lt;/Category&gt;&#xD;
            &lt;TotalDebits&gt;60.62&lt;/TotalDebits&gt;&#xD;
            &lt;TotalCredits&gt;-234.36&lt;/TotalCredits&gt;&#xD;
        &lt;/Category&gt;&#xD;
    &lt;/Summary&gt;&#xD;
  </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可以访问的代码创建了真实结果树片段?

2 个答案:

答案 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])会返回什么?