0

我正在通过存储过程从数据库中获取一些数据,并且我正在使用 FOR XML AUTO 来获取这些数据。查询是这样的

WHERE ITEMNUMBER=@itemid AND DATASET = @dataset FOR XML AUTO, ELEMENTS) AS filters

结果 xml 是

    <filters extra="filters">
    <ISP_WebItem>
      <FILTER>Type</FILTER>
      <FILTERNAME>Matematik</FILTERNAME>
      <UNITCODE></UNITCODE>
    </ISP_WebItem>
    <ISP_WebItem>
      <FILTER>Strømkilde</FILTER>
      <FILTERNAME>Solceller</FILTERNAME>
      <UNITCODE></UNITCODE>
    </ISP_WebItem>
  </filters>

现在我的问题是,当我尝试在我的 xslt 中循环这个结果时,我无法得到任何结果。我的 XSLT 代码是这样的

  <xsl:variable name="filt" select="msxsl:node-set(filters)"/>   
<xsl:for-each select="$filt/ISP_WebItem">   
  <xsl:copy-of select="FILTER"/>
</xsl:for-each>

我在我的 'filt' 变量中正确获取了过滤器 xml,但是 for each 循环永远不会正确执行。当我尝试在我的代码中放置断点时,我注意到代码执行永远不会进入循环内部,这意味着

 <xsl:for-each select="filt/ISP_WebItem">   

这段代码永远无法满足。对于额外信息,此过滤器节点是大型 XML 数据的一部分,此数据中的所有其他节点都正常工作(即我可以循环或对它们进行任何操作)。任何人都可以提出任何可能的原因。

4

1 回答 1

2

XSLT 有两个问题。首先,filt是一个变量,因此您需要在它前面加上一个 $ 来表示这一点,否则 XSLT 将寻找一个名为filt的元素

<xsl:for-each select="$filt/ISP_WebItem">   

其次,在您的 XML 示例中,FILTER是一个元素,但您的xsl:copy-of语句正在寻找一个名为“FILTER”的属性。你应该这样做

<xsl:copy-of select="FILTER"/>

但是,如果它是一个属性,请将其保留为<xsl:copy-of select="@FILTER"/>

例如,此 XSLT 可以工作

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" extension-element-prefixes="msxsl">
   <xsl:output method="xml" indent="yes"/>
   <xsl:template match="/">
      <xsl:variable name="filt" select="msxsl:node-set(filters)"/>
      <xsl:for-each select="$filt/ISP_WebItem">
         <xsl:copy-of select="FILTER"/>
      </xsl:for-each>
   </xsl:template>
</xsl:stylesheet>

事实上,如果你只是想复制元素,而不是别的,你可以删除xsl:for-each并将其简化为

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" extension-element-prefixes="msxsl">
   <xsl:output method="xml" indent="yes"/>
   <xsl:template match="/">
      <xsl:variable name="filt" select="filters"/>
      <xsl:copy-of select="$filt/ISP_WebItem/FILTER"/>
   </xsl:template>
</xsl:stylesheet>

但是,我不太确定您是否需要在这种情况下使用节点集(尽管我猜您只是展示了一个简化的代码示例,所以可能在其他地方有必要)。

以下也将起作用

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" extension-element-prefixes="msxsl">
   <xsl:output method="xml" indent="yes"/>
   <xsl:template match="/">
      <xsl:for-each select="filters/ISP_WebItem">
         <xsl:copy-of select="FILTER"/>
      </xsl:for-each>
   </xsl:template>
</xsl:stylesheet>

编辑:如果您仍然遇到问题,请尝试以下其中一种表达方式。

<xsl:for-each select="$filt//ISP_WebItem">
于 2012-12-31T07:37:56.117 回答