You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 04:19:57