使用 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 选择最后一个子元素的主要内容,如果未能解决你的问题,请参考以下文章

jquery如何获取第一个或最后一个子元素

jquery如何获取第一个或最后一个子元素?

jquery如何获取第一个或最后一个子元素

css选择器中,为啥nth

XSLT / Muenchian 分组:如何从组中选择具有某些子元素的元素?

JQuery选择器——子元素筛选选择器和表单元素选择器