复制根元素的所有子元素,给定元素除外

Copy all the sub elements of a root element except a given element

我是 xslt 转换的新手。我需要打印除给定元素之外的所有子元素。这是我的 xslt:

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <statuses>
            <xsl:for-each select="statuses">
                <xsl:variable name='test1' select="status[name='bag']">
                </xsl:variable>

    <xsl:copy-of select="$test1" />
            </xsl:for-each></statuses>
        </xsl:template>
    </xsl:stylesheet>

输入XML如下所述。根元素是状态。

<statuses>
    <result>name</result>
<count>12</count>
        <status>
            <stockNo>1000</stockNo>
            <itemNo>500</itemNo>
            <name>frock</name>
        </status>
<status>
                <stockNo>1000</stockNo>
                <itemNo>500</itemNo>
                <name>bag</name>
            </status>
<gage>3</gage>
</statuses>

我需要打印 'bag' 的所有 'status' 元素以及所有其他元素。除了包之外,没有连衣裙类型或任何其他类型的状态。如果您能帮助我编写 xslt 来满足我的要求,我将不胜感激。 输出 XML 如下所述。状态、结果、计数、筛选状态、应打印页面。

<statuses>
        <result>name</result>
    <count>12</count>
    <status>
                    <stockNo>1000</stockNo>
                    <itemNo>500</itemNo>
                    <name>bag</name>
                </status>
    <gage>3</gage>
</statuses>

XSLT 1.0

我不确定我是否理解你。但是如果你要得到的xml是你的post最后的那个,你可以使用:

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="xml" encoding="utf-8" indent="yes"/>

    <xsl:template match="/">
        <xsl:apply-templates />
    </xsl:template>

    <xsl:template match="node()">
        <xsl:copy>
            <xsl:apply-templates select="node()" />
        </xsl:copy>
    </xsl:template>


    <xsl:template match="status" >

        <xsl:if test="name = 'bag'">
            <status>
            <xsl:apply-templates />
        </status>
        </xsl:if>
    </xsl:template>

</xsl:stylesheet>

这应该重新打印您的 xml 文档,其中没有任何名称不是 bag 的状态元素。

或者简单地说:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="*">
    <xsl:copy>
        <xsl:apply-templates select="node() except status[name!='bag']"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

或者,如果您正在使用 XSLT 1.0,正如您显然所做的那样(尽管已将您的问题标记为 XSLT 2.0):

<xsl:template match="*">
    <xsl:copy>
        <xsl:apply-templates select="node()[not(self::status[name!='bag'])]"/>
    </xsl:copy>
</xsl:template>