0

我正在尝试使用 msxsl:node-set() 函数将节点从存储在变量中的节点集中拉出,但没有得到任何东西。我的 xml 看起来像这样:

<Root>
  <Items olditemnumber="100" newitemnumber="200">
    <Item ItemNumber="100" ItemAliasCode="1001" ItemCode="X" />
    <Item ItemNumber="100" ItemAliasCode="1002" ItemCode="X" />
    <Item ItemNumber="200" ItemAliasCode="2001" ItemCode="X" />
    <Item ItemNumber="200" ItemAliasCode="2003" ItemCode="X" />
    <Item ItemNumber="100" ItemAliasCode="1003" ItemCode="P" />
    <Item ItemNumber="100" ItemAliasCode="1004" ItemCode="P" />
    <Item ItemNumber="200" ItemAliasCode="2002" ItemCode="P" />
  </Items>
</Root>

在我的 xslt 中,我尝试使用节点的子集填充变量,然后使用 msxsl:node-set() 函数调用它们。然而,这不会返回任何东西。XSLT 看起来像这样:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                              xmlns:msxsl="urn:schemas-microsoft-com:xslt">
 <xsl:template match="//Root">
   <xsl:variable name="OldItemNumber" select="/Items/@olditemnumber"/>
   <xsl:variable name="NewItemNumber" select="/Items/@newitemnumber"/>
   <xsl:variable name="OldItems">
     <xsl:value-of select="//Item[@ItemNumber = $OldItemNumber]"/>
   </xsl:variable>
   <xsl:variable name="NewItems">
     <xsl:value-of select="//Item[@ItemNumber = $NewItemNumber]"/>
   </xsl:variable>
   <xsl:for-each select="msxsl:node-set($OldItems)/Item">
     ...work
   </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

XSLT 跳过了 for-each 循环,尽管我在手表中看到 Xpath 查询在分配变量时抓取了正确的节点。手表还告诉我 msxsl:node-set() 函数未定义。任何帮助,将不胜感激。我错过了什么?

4

1 回答 1

1
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                              xmlns:msxsl="urn:schemas-microsoft-com:xslt">
 <xsl:template match="//Root">
   <xsl:variable name="OldItemNumber" select="/Items/@olditemnumber"/>
   <xsl:variable name="NewItemNumber" select="/Items/@newitemnumber"/>
   <xsl:variable name="OldItems" select="//Item[@ItemNumber = $OldItemNumber]"/>
   <xsl:variable name="NewItems" select="//Item[@ItemNumber = $NewItemNumber]"/>
   <xsl:for-each select="$OldItems">
     ...work
   </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

msxsl:node-set用于将结果树片段(又名 RTF)转换为节点集,这在您的情况下不需要。

xsl:value-of用于创建文本节点,因此不要将其用于选择要进一步查询/处理的输入树的节点。

于 2013-07-23T19:21:05.637 回答