如何在XSLT的xsl:value-of中用节点列表提取指定顺序的XML数据
按指定顺序提取XML中Reported类型的ResultValue值
源XML数据
<?xml version="1.0" encoding="utf-8"?> <Statistic> <Elements> <Element ElementName="A" Type="Element"> <ElementResult StatType="Mean"></ElementResult> <ElementResult StatType="Reported"> <ResultValue>10</ResultValue> </ElementResult> </Element> </Elements> <Elements> <Element ElementName="B" Type="Element"> <ElementResult StatType="Mean"></ElementResult> <ElementResult StatType="Reported"> <ResultValue>5</ResultValue> </ElementResult> </Element> </Elements> <Elements> <Element ElementName="C" Type="Element"> <ElementResult StatType="Mean"></ElementResult> <ElementResult StatType="Reported"> <ResultValue>0.5</ResultValue> </ElementResult> </Element> </Elements> <Elements> <Element ElementName="D" Type="Element"> <ElementResult StatType="Mean"></ElementResult> <ElementResult StatType="Reported"> <ResultValue>0.0001</ResultValue> </ElementResult> </Element> </Elements> <Elements> <Element ElementName="E" Type="Element"> <ElementResult StatType="Mean"></ElementResult> <ElementResult StatType="Reported"> <ResultValue>0.1</ResultValue> </ElementResult> </Element> </Elements> </Statistic>
现有XSLT代码
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" version="1.0"> <xsl:output method="text" /> <xsl:variable name="ElementArray"> <ElementItem Item="C" /> <ElementItem Item="D" /> <ElementItem Item="A" /> <ElementItem Item="B" /> <ElementItem Item="E" /> </xsl:variable> <xsl:template match="/"> <xsl:for-each select="msxsl:node-set($ElementArray)/ElementItem"> <xsl:value-of select="@Item"/> <!-- 此语句可正常输出CDABE --> </xsl:for-each> </xsl:template> </xsl:stylesheet>
问题需求
已通过ElementArray变量指定提取顺序(C、D、A、B、E),需要在XPath中引用循环的@Item属性,按顺序获取对应Element的Reported类型ResultValue,期望输出:0.5 0.0001 10 5 0.1
解决方案
在XPath的谓词中,直接使用@Item会指向当前Element节点的属性,而非外层循环的ElementItem节点属性。需要用current()/@Item明确引用循环上下文的Item属性。
修改后的完整XSLT代码:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" version="1.0"> <xsl:output method="text" /> <xsl:variable name="ElementArray"> <ElementItem Item="C" /> <ElementItem Item="D" /> <ElementItem Item="A" /> <ElementItem Item="B" /> <ElementItem Item="E" /> </xsl:variable> <xsl:template match="/"> <xsl:for-each select="msxsl:node-set($ElementArray)/ElementItem"> <!-- 使用current()/@Item引用当前循环的ElementItem节点的Item属性 --> <xsl:value-of select="/Statistic/Elements/Element[@ElementName=current()/@Item]/ElementResult[@StatType='Reported']/ResultValue" /> <xsl:text> </xsl:text> <!-- 添加空格分隔结果 --> </xsl:for-each> </xsl:template> </xsl:stylesheet>
说明
current()函数用于获取当前xsl:for-each循环的上下文节点(即ElementItem),确保在XPath谓词中正确引用到指定的ElementName。- 添加
<xsl:text> </xsl:text>实现结果值之间的空格分隔,满足期望的输出格式。
内容的提问来源于stack exchange,提问作者Martin Bo
相关产品推荐
相关产品推荐

