首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在转换后的解析XML上使用exslt:node-set()

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

Stack Overflow用户
提问于 2013-01-19 04:58:38
回答 2查看 8K关注 0票数 1

使用类似于答案found in this question的东西,我组合了一个基于off的函数,以创建一个XML结果树片段,并将其加载到一个变量中。

我能够将这个XML转换成

代码语言:javascript
复制
  <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>

到这个

代码语言:javascript
复制
<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>

它包含在这个变量中

代码语言:javascript
复制
  <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()来访问这个变量中的节点,但是我没有得到任何信息。

使用像这样的函数时

代码语言:javascript
复制
<xsl:for-each select="exslt:node-set($SummaryItems)/Summary/Category">

它不会产生任何结果。

我确实在xsl:stylesheet中包含了xmlns:exslt="http://exslt.org/common"声明,并且我测试了node-set函数,所以我知道它只是不能在变量中使用转换后的XML。

我是否使用exslt:node-set可以访问的代码创建了真正的结果树片段?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-19 05:17:34

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

你说

代码语言:javascript
复制
<xsl:copy-of select="exslt:node-set($SummaryItems)"/>

工作,所以试一试

代码语言:javascript
复制
<xsl:copy-of select="exslt:node-set($SummaryItems)/*"/>

如果有效,请尝试

代码语言:javascript
复制
<xsl:copy-of select="exslt:node-set($SummaryItems)/Summary"/>

如果这不起作用,那么Summary就不会选择<Summary>,因为100次中有99次是名称空间问题。

原始答案(已在问题中修正)

代码语言:javascript
复制
<xsl:for-each select="exslt:node-set($SummaryItems)\Summary\Category">

应为XPath语法错误提供错误的路径分隔符

代码语言:javascript
复制
<xsl:for-each select="exslt:node-set($SummaryItems)/Summary/Category">
票数 4
EN

Stack Overflow用户

发布于 2013-01-19 10:59:17

David Carlisle是对的,命名空间问题可能是导致不能按预期匹配的最常见原因。

节点集问题的第二个常见来源(至少,它经常发生在我身上)是暂时的混淆,不知道哪些节点由绑定到节点集的变量名表示。根据绑定的具体实现方式,细节会有所不同,但是从您所说的情况来看,$SummaryItems很可能绑定到一个包含两个Category元素(等等)的Summary元素--如果是这样,那么表达式exslt:node-set($SummaryItems)/Summary/Category将不会产生任何结果,因为$SummaryItems不包含Summary元素。您需要的Summary元素不是$SummaryItems中节点的子节点--它们是$SummaryItems中的节点。

在这种情况下,我会尝试exslt:node-set($SummaryItems)/Category

在更一般的情况下,当我遇到这样的问题时,我会运行测试代码来找出我所处的位置:例如,name(exslt:node-set($SummaryItems)[1])返回什么?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14407511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档