嵌入 CDATA 中的 xslt 样式表的身份转换

问题描述 投票:0回答:0

输入数据

    <?xml version="1.0" encoding="UTF-8"?>
<root>
    <PETS>
        <cats_stylesheet><![CDATA[<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
        <Cats>
            <name>
                <xsl:value-of select="'Felix'"/>
            </name>
            <breed>
                <xsl:value-of select="cat/breed"
            </breed>
            <age>
                <xsl:value-of select="cat/age"
            </age>
        </Cats>
    </xsl:template>
</xsl:stylesheet>
]]></cats_stylesheet>
        <dogs_stylesheet><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
        <Dogs>
            <name>
                <xsl:value-of select="'Rover'"/>
            </name>
            <breed>
                <xsl:value-of select="dog/breed"/>
            </breed>
            <age>
                <xsl:value-of select="dog/age"/>
            </age>
        </Dogs>
    </xsl:template>
</xsl:stylesheet>
]]></dogs_stylesheet>
    </PETS>
</root>

所需输出

这应该只是原件的副本,但只更改了狗的名字。

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <PETS>
        <cats_stylesheet><![CDATA[<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
        <Cats>
            <name>
                <xsl:value-of select="'Felix'"/>
            </name>
            <breed>
                <xsl:value-of select="cat/breed"
            </breed>
            <age>
                <xsl:value-of select="cat/age"
            </age>
        </Cats>
    </xsl:template>
</xsl:stylesheet>
]]></cats_stylesheet>
        <dogs_stylesheet><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
        <Dogs>
            <name>
                <xsl:value-of select="'Cerberus'"/>
            </name>
            <breed>
                <xsl:value-of select="dog/breed"/>
            </breed>
            <age>
                <xsl:value-of select="dog/age"/>
            </age>
        </Dogs>
    </xsl:template>
</xsl:stylesheet>
]]></dogs_stylesheet>
    </PETS>
</root>

我尝试过的

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:axsl="http://www.w3.org/1999/XSL/TransformAlias"
    version="3.0">
    <xsl:output method="xml" encoding="UTF-8" indent="yes" 
        cdata-section-elements="cats_stylesheet dogs_stylesheet" 
        exclude-result-prefixes="xsl"/>
    <xsl:namespace-alias stylesheet-prefix="axsl" result-prefix="xsl"/>

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

        <xsl:variable name="contents_of_cdata">
            <xsl:value-of disable-output-escaping="true" select="text()"/>
        </xsl:variable>
    
        <dogs_stylesheet>
            <Dogs>
                <name>
                    <xsl:value-of select="'Cerberus'"/>
                </name>
                <xsl:copy-of select="$contents_of_cdata/xsl:stylesheet/xsl:template/Dogs/node()[not(self::Dogs/name)]"/>
            </Dogs>
        </dogs_stylesheet>

    </xsl:template>
</xsl:stylesheet>

我尝试将 CDATA 文本转换为“节点集”(使用旧的 xsltl 1.0 术语),但这不起作用。

  1. 它没有将 dogs_stylesheet 放入 CDATA 标记中
  2. 它正在插入名称空间 dogs_stylesheet
  3. CDATA 文本未转换为“节点集”

如何才能达到想要的输出?

xslt xslt-2.0 cdata xslt-3.0
© www.soinside.com 2019 - 2024. All rights reserved.