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

时间:2015-05-17 10:26:10

标签: xml xslt xslt-2.0

我是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>

我需要打印所有&#39;状态&#39; &#39; bag&#39;的元素与所有其他元素一样。没有工装类型或除袋子外的任何其他类型的状态。如果你能帮助我写xslt以满足我的要求,我将不胜感激。 输出XML如下所述。应打印状态,结果,计数,过滤状态,页面。

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

2 个答案:

答案 0 :(得分:0)

XSLT 1.0

我不确定我是否理解你。但是,如果你想获得的xml是帖子末尾的那个,你可以使用:

    <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文档,而不包含任何名称不是包的状态元素。

答案 1 :(得分:0)

或者简单地说:

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>