在xsl copy-of select node()之后匹配和更改标记值

时间:2017-08-29 02:21:01

标签: xml xslt

我收到了不同的xmls。其中一个标签的值为true / false,我必须用1/0替换。 我的xsl:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
    <tag1>
        <tag2>
            <xsl:choose>
                <xsl:when test="string-length(ERRORMSG) > 0">
                    <xsl:apply-templates select="ERRORMSG" />
                </xsl:when>
                <xsl:otherwise>
                    <xsl:template match="node()|@*">
                        <xsl:copy>
                            <xsl:apply-templates select="node()|@*"/>
                        </xsl:copy>
                    </xsl:template>
                </xsl:otherwise>
            </xsl:choose>
        </tag2>
    </tag1>
</xsl:template>

我的xml:

<tag2>
    <tag3>
        <tag4>
            <tag5>abc</tag5>
            <tag6>
                <tag7>
                    <tag8>false</tag8>
                    <tag9>true</tag9>
                </tag7>
            </tag6>
        </tag4>
    </tag3>
</tag2>

我怎么能这样做?我无法删除<xsl:apply-templates select="node()|@*"/>,因为我正在接收不同的模板,其中一个模板我必须将特定标记值(tag8,tag9)替换为1/0(如果为true / false)。

2 个答案:

答案 0 :(得分:0)

这可以通过修改XSLT以使用 identity transform 首先复制所有节点,然后使用模板修改<tag8><tag9>节点中的值来实现。 / p>

<强> XSLT

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:variable name="true" select="'1'" />
    <xsl:variable name="false" select="'0'" />

    <!-- Identity Transform -->
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*" />
        </xsl:copy>
    </xsl:template>

    <xsl:template match="tag8">
        <xsl:copy>
            <xsl:value-of select="$false" />
        </xsl:copy>
    </xsl:template>

    <xsl:template match="tag9">
        <xsl:copy>
            <xsl:value-of select="$true" />
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

<强>输出

<tag2>
    <tag3>
        <tag4>
            <tag5>abc</tag5>
            <tag6>
                <tag7>
                    <tag8>0</tag8>
                    <tag9>1</tag9>
                </tag7>
            </tag6>
        </tag4>
    </tag3>
</tag2>

答案 1 :(得分:0)

你也可以试试这个:

XSLT 1.0

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

    <!-- Identity Transform -->
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*" />
        </xsl:copy>
    </xsl:template>

    <xsl:template match="*[normalize-space(.) = 'true' or normalize-space(.) = 'false']">
        <xsl:copy>
            <xsl:choose>
                <xsl:when test="normalize-space(.) = 'true'">1</xsl:when>
                <xsl:otherwise>0</xsl:otherwise>
            </xsl:choose>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

XSLT 2.0

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

    <!-- Identity Transform -->
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*" />
        </xsl:copy>
    </xsl:template>

    <xsl:template match="*[normalize-space(.) = 'true' or normalize-space(.) = 'false']">
        <xsl:copy>
            <xsl:value-of select="if(normalize-space(.) = 'true') then '1' else '0'"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

<强>输出

 <tag2>
    <tag3>
        <tag4>
            <tag5>abc</tag5>
            <tag6>
                <tag7>
                    <tag8>0</tag8>
                    <tag9>1</tag9>
                </tag7>
            </tag6>
        </tag4>
    </tag3>
</tag2>