1

使用类似于在这个问题中找到的答案,我将一个基于 off 的函数组合在一起,以创建一个 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

4

2 回答 2

4

不匹配的最常见原因是它们不在您期望的命名空间中,很难说因为您没有显示完整的代码而是分阶段工作

你说

<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"/>

如果这不起作用,那么在 100 次中有 99 次中Summary没有选择哪个是命名空间问题。<Summary>


原始答案(已修复)

<xsl:for-each select="exslt:node-set($SummaryItems)\Summary\Category">

应该给出 XPath 语法错误错误的路径分隔符

<xsl:for-each select="exslt:node-set($SummaryItems)/Summary/Category">
于 2013-01-18T21:17:33.670 回答
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])例如,返回了什么?

于 2013-01-19T02:59:16.530 回答