Sql server 无法循环获取XML自动结果
我通过存储过程从数据库中获取一些数据,并使用FOR XML AUTO获取这些数据。 查询是这样的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
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循环问题的根本原因