使用XSLT选择名为element的最后一个子元素的实现方法咨询
解决方案
你可以通过XPath的递归匹配符//跳过中间任意层级的其他节点,搭配last()函数筛选最后一个匹配的xsd:element节点,具体实现如下:
核心逻辑说明
//是XPath的递归通配符,会匹配当前节点下所有后代层级的目标节点,自动忽略中间的xsd:complexType、xsd:sequence等其他节点- 谓词
[last()]会从匹配到的节点集合中选取最后一个元素
修改后的完整XSLT代码
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="1.0"> <xsl:template match="/"> <root> <xsl:for-each select="/xsd:schema/xsd:complexType/xsd:all/xsd:element"> <!-- 选取当前element下所有层级中最后一个xsd:element节点 --> <xsl:variable name="lastElement" select=".//xsd:element[last()]"/> <xsl:element name="{$lastElement/@name}"> <xsl:for-each select="$lastElement/xsd:annotation/xsd:appinfo/xsd:hasProperty"> <field> <xsl:attribute name="name"> <xsl:value-of select="@name" /> </xsl:attribute> <xsl:value-of select="@value"/> </field> </xsl:for-each> </xsl:element> </xsl:for-each> </root> </xsl:template> </xsl:stylesheet>
输出效果
针对你提供的输入XML,上述代码会匹配到Currency节点下嵌套的最后一个xsd:element(即TypeSysdate节点),输出对应的field属性。
如果你需要直接获取整个XML中所有xsd:element的最后一个,只需要把循环的select语句改成//xsd:element[last()]即可。
内容的提问来源于stack exchange,提问作者Jigar Naik
相关产品推荐
相关产品推荐

