Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 无法循环获取XML自动结果_Sql Server_Xml_Xslt_Xslt 1.0 - Fatal编程技术网

Sql server 无法循环获取XML自动结果

Sql server 无法循环获取XML自动结果,sql-server,xml,xslt,xslt-1.0,Sql Server,Xml,Xslt,Xslt 1.0,我通过存储过程从数据库中获取一些数据,并使用FOR XML AUTO获取这些数据。 查询是这样的 WHERE ITEMNUMBER=@itemid AND DATASET = @dataset FOR XML AUTO, ELEMENTS) AS filters <xsl:variable name="filt" select="msxsl:node-set(filters)"/> <xsl:for-each select="$filt/ISP_WebItem"&g

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

WHERE ITEMNUMBER=@itemid AND DATASET = @dataset FOR XML AUTO, ELEMENTS) AS filters
  <xsl:variable name="filt" select="msxsl:node-set(filters)"/>   
<xsl:for-each select="$filt/ISP_WebItem">   
  <xsl:copy-of select="FILTER"/>
</xsl:for-each>
结果是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代码如下

WHERE ITEMNUMBER=@itemid AND DATASET = @dataset FOR XML AUTO, ELEMENTS) AS filters
  <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数据的一部分,该数据中的每个其他节点都正常工作(即我可以循环或使用它们执行任何操作)。
任何人都可以提出任何可能的原因。

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

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

其次,在XML示例中,FILTER是一个元素,但是xsl:copy的语句正在查找名为“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>

但是,我不太确定在本例中是否需要使用节点集(尽管我猜您只是显示了一个abdriged代码示例,所以在其他地方可能需要它)

以下措施也将起作用

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


如何神奇地知道select中的
filt
是对变量的引用,而不是被解释为XPath查询的常规部分?在这种情况下,您能否显示预期的输出以及当前获得的输出?谢谢@TimC:我需要在网格列表中显示每个“ISP\U WebItem”节点的数据。您是否可以显示仅执行
时获得的确切输出,因为这可能有助于解决问题?谢谢@我在我的问题中给出了同样的答案:我已经改变了你指出的错误,谢谢你。但是我的问题仍然存在。我得到了正确的结果,但这一切都没有。我认为这也是我的for循环问题的根本原因