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

如何使用XSLT获取父节点下的子节点?附XML结构示例

如何用XSLT获取父节点下的子节点?

首先先把你提供的XML片段补全成可测试的完整结构(原片段有截断):

<Root>
  <ModelAttrib>
    <ModelAttribData>
      <ID>5</ID>
      <AttributeID>1</AttributeID>
    </ModelAttribData>
    <Attribute>
      <AttributeData>
        <ID>1</ID>
        <AttribVariation>
          <AttribVariationData>
            <ID>2</ID>
            <AttributeID>1</AttributeID>
            <ModelAttribVar>
              <ModelAttribVarData>
                <ID>3</ID>
                <AttribVariationID>2</AttribVariationID>
              </ModelAttribVarData>
            </ModelAttribVar>
          </AttribVariationData>
        </AttribVariation>
      </AttributeData>
    </Attribute>
  </ModelAttrib>
</Root>

接下来分几种常用场景给你演示对应的XSLT写法:

1. 获取父节点的直接子节点

比如要拿到<ModelAttrib>下的直接子节点<ModelAttribData>和<Attribute>,可以用XPath的child::轴(或者简写为*匹配所有直接子节点):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/Root">
    <!-- 遍历ModelAttrib的所有直接子节点 -->
    <DirectChildren>
      <xsl:for-each select="ModelAttrib/*">
        <ChildNode>
          <NodeName><xsl:value-of select="name()"/></NodeName>
          <NodeValue><xsl:value-of select="normalize-space()"/></NodeValue>
        </ChildNode>
      </xsl:for-each>
    </DirectChildren>
  </xsl:template>
</xsl:stylesheet>

这里name()用来获取子节点的名称,normalize-space()用来清理节点文本中的空白字符。

2. 获取父节点下的指定子节点

如果只想精准获取某个父节点下的特定子节点(比如<AttributeData>下的<ID>和<AttribVariation>),可以直接写完整的XPath路径:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <!-- 获取AttributeData下的ID节点文本值 -->
    <AttributeDataID>
      <xsl:value-of select="Root/ModelAttrib/Attribute/AttributeData/ID"/>
    </AttributeDataID>
    
    <!-- 复制AttributeData下的整个AttribVariation节点(包括子内容) -->
    <xsl:copy-of select="Root/ModelAttrib/Attribute/AttributeData/AttribVariation"/>
  </xsl:template>
</xsl:stylesheet>

xsl:value-of用于提取节点的文本内容,xsl:copy-of则会完整复制目标节点及其所有子节点。

3. 获取父节点下所有层级的后代子节点

如果需要递归获取父节点下所有嵌套的子节点(不管层级多深),可以用descendant::轴(或者简写为//):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/Root/ModelAttrib">
    <AllDescendants>
      <!-- 遍历当前节点下所有层级的子节点 -->
      <xsl:for-each select="descendant::*">
        <DescendantNode>
          <Path><xsl:value-of select="name(.)"/></Path>
          <Value><xsl:value-of select="normalize-space(text())"/></Value>
        </DescendantNode>
      </xsl:for-each>
    </AllDescendants>
  </xsl:template>
</xsl:stylesheet>

descendant::*会匹配当前节点下所有层级的元素节点,不管嵌套多少层。

小提示

XPath里的轴是核心:

  • child:::匹配直接子节点(默认轴,可省略)
  • descendant:::匹配所有后代节点(包括子节点的子节点)
  • 如果要按条件筛选子节点,可以加谓词,比如ModelAttribData[ID=5]就能选中ID为5的<ModelAttribData>节点。

内容的提问来源于stack exchange,提问作者Hitzz91

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:55:28