如何使用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
相关产品推荐
相关产品推荐

