使用 XSLT 选择最后一个子元素
Posted
技术标签:
【中文标题】使用 XSLT 选择最后一个子元素【英文标题】:Selecting last child element using XSLT 【发布时间】:2021-10-26 04:01:32 【问题描述】:我有以下 XML 结构,我想找出标签名称为 element
的最后一个孩子,而不管中间的其他元素是什么。如何添加通配符以选择名称为“元素”的最后一个子元素?
下面是我的 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">
<xsl:element name="@name">
<xsl:for-each select="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 的结构有些以下。
<?xml version="1.0"?>
<xsd:schema xmlns:xdb="http://xmlns.oracle.com/xdb" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xdb:storeVarrayAsTable="true">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"
schemaLocation="http://www.w3.org/2001/xml.xsd"/>
<xsd:element name="row" type="BALANCEType">
<xsd:annotation>
<xsd:documentation>This is the top level element for the record data</xsd:documentation>
<xsd:appinfo>
<xsd:hasProperty name="locked" value="no"/>
<xsd:hasProperty name="useschema" value="no"/>
<xsd:hasProperty name="register" value="no"/>
</xsd:appinfo>
</xsd:annotation>
</xsd:element>
<xsd:complexType name="BALANCEType" xdb:maintainDOM="false">
<xsd:annotation>
<xsd:documentation>Testing</xsd:documentation>
</xsd:annotation>
<xsd:all>
<xsd:element name="Currency" minOccurs="0" xdb:SQLName="CURRENCY">
<xsd:annotation>
<xsd:documentation>CURRENCY</xsd:documentation>
<xsd:appinfo>
<xsd:hasProperty name="fieldtag" value="ContractBalId"/>
<xsd:hasProperty name="fieldnumber" value="0"/>
</xsd:appinfo>
</xsd:annotation>
<xsd:element name="gTypeSysdate" minOccurs="0">
<xsd:complexType xdb:maintainDOM="false">
<xsd:sequence minOccurs="0">
<xsd:element name="mTypeSysdate" minOccurs="0" maxOccurs="unbounded">
<xsd:complexType xdb:maintainDOM="false">
<xsd:sequence minOccurs="0">
<xsd:element name="TypeSysdate" minOccurs="0" xdb:SQLName="TYPE_SYSDATE">
<xsd:annotation>
<xsd:documentation>TYPE.SYSDATE</xsd:documentation>
<xsd:appinfo>
<xsd:hasProperty name="fieldtag" value="ContractBalId"/>
<xsd:hasProperty name="fieldnumber" value="0"/>
</xsd:appinfo>
</xsd:annotation>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:element>
</xsd:all>
</xsd:complexType>
</xsd:schema>
【问题讨论】:
【参考方案1】:在例如路径中xsd:all/xsd:element
选择all
元素的所有element
子元素,如果只想选择最后一个element
子元素,只需使用xsd:all/xsd:element[last()]
。
【讨论】:
以上是关于使用 XSLT 选择最后一个子元素的主要内容,如果未能解决你的问题,请参考以下文章