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

在转换的解析XML上使用exslt:node-set(),xml,xslt,exslt,Xml,Xslt,Exslt,使用与答案类似的方法,我将一个基于off的函数组合在一起,创建一个XML结果树片段,并将其加载到一个变量中 我能够转换这个XML <Summary> &lt;Summary&gt;&#xD; &lt;Category&gt;&#xD; &lt;Category&gt;Tuition and Fees&lt;/Category&gt;&#xD;

使用与答案类似的方法,我将一个基于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>
它不会产生任何结果

我确实包含了xmlns:exslt=http://exslt.org/common 在xsl:stylesheet中声明,并且我已经测试了节点集函数,所以我知道它不适用于变量中转换的XML


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

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

你说

<xsl:copy-of select="exslt:node-set($SummaryItems)"/>
应给出XPath语法错误错误路径分隔符错误

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

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

你说

<xsl:copy-of select="exslt:node-set($SummaryItems)"/>
应给出XPath语法错误错误路径分隔符错误

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

David Carlisle说得对,命名空间问题可能是导致事情不符合预期的最常见原因

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

在本例中,我将尝试exslt:node set$SummaryItems/Category


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

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

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

在本例中,我将尝试exslt:node set$SummaryItems/Category


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

请编辑问题并提供完整但简短的代码示例:1 XML文档;2.转型。3在1上执行2时得到的结果;4.想要的结果。5您正在使用的XSLT处理器。如果没有这些信息,人们只能猜测-请节省大家的时间。@DimitreNovatchev我尝试添加更多信息,而不只是在这个问题中添加整个大型代码。我想我已经确定了问题在于函数没有创建我可以访问的真实结果树片段。我有一种相当粗糙的方法来解析我的XMl,这似乎在起作用,但我仍然很好奇为什么原始函数没有按我预期的方式工作。Mathew,xxx:节点集对于将RTF转换为常规节点集很有用。然而,在所描述的情况下,这个RTF只包含一个文本节点,而不是节点集。请记住,即使表示XML的字符串不是XML节点/文档/片段,也要记住。该变量中的字符串需要由XML解析器解析,才能成为真正的标记。@MatthewGreen如果您还没有显示任何可以让任何人回答您的问题的信息,您应该能够发布一个完整的样式表,该样式表包含引用的摘要输入文件,并且不会产生任何结果,有一个GreatUnescape的定义,然后有一些代码使用,因为说如何修复代码应该是相当容易的。你能至少向我们展示你的问题的内容吗?请编辑问题,并提供一个完整但简短的代码示例:1 XML文档;2.转型。3在1上执行2时得到的结果;4.想要的结果。5您正在使用的XSLT处理器。如果没有这些信息,人们只能猜测-请节省大家的时间。@DimitreNovatchev我尝试添加更多信息,而不只是在这个问题中添加整个大型代码。我想我
e发现问题在于函数没有创建我可以访问的真实结果树片段。我有一种相当粗糙的方法来解析我的XMl,这似乎在起作用,但我仍然很好奇为什么原始函数没有按我预期的方式工作。Mathew,xxx:节点集对于将RTF转换为常规节点集很有用。然而,在所描述的情况下,这个RTF只包含一个文本节点,而不是节点集。请记住,即使表示XML的字符串不是XML节点/文档/片段,也要记住。该变量中的字符串需要由XML解析器解析,才能成为真正的标记。@MatthewGreen如果您还没有显示任何可以让任何人回答您的问题的信息,您应该能够发布一个完整的样式表,该样式表包含引用的摘要输入文件,并且不会产生任何结果,有一个GreatUnescape的定义,然后有一些代码使用,因为说如何修复代码应该是相当容易的。你能至少向我们展示一下你的代码的内容吗?我不太熟悉名称空间,所以你能再解释一下吗?我是否需要结果树片段的名称空间?您不需要名称空间,但名称空间是名称的一部分,因此在没有名称空间的情况下对摘要执行XPath/Summary查询,但如果在构造变量时存在有效的默认名称空间xmlns=foo,并且变量在名称空间foo中包含Summary,则该名称空间不匹配。您需要在样式表中使用xmlns:f=foo和/f:Summary的XPath,但是由于您没有说明变量是如何声明的,所以它都是从水晶球开始的。我用更多的信息更新了这个问题。我对这个问题有一个评论,解释了我最近对这个问题的一些想法。似乎函数确实给我带来了一些问题,所以我不得不重做我是如何创建这个变量的。谢谢你的帮助。我不太熟悉名称空间,你能再解释一下吗?我是否需要结果树片段的名称空间?您不需要名称空间,但名称空间是名称的一部分,因此在没有名称空间的情况下对摘要执行XPath/Summary查询,但如果在构造变量时存在有效的默认名称空间xmlns=foo,并且变量在名称空间foo中包含Summary,则该名称空间不匹配。您需要在样式表中使用xmlns:f=foo和/f:Summary的XPath,但是由于您没有说明变量是如何声明的,所以它都是从水晶球开始的。我用更多的信息更新了这个问题。我对这个问题有一个评论,解释了我最近对这个问题的一些想法。似乎函数确实给我带来了一些问题,所以我不得不重做我是如何创建这个变量的。谢谢你的帮助。
<xsl:copy-of select="exslt:node-set($SummaryItems)/*"/>
<xsl:copy-of select="exslt:node-set($SummaryItems)/Summary"/>
<xsl:for-each select="exslt:node-set($SummaryItems)\Summary\Category">
<xsl:for-each select="exslt:node-set($SummaryItems)/Summary/Category">