除了应该按原样复制的元素名称前缀所有元素名称

时间:2017-12-28 01:13:24

标签: xml xslt

我正在尝试获取一个XSLT,它将小写所有元素名称,并为除了id字段之外的所有元素名称添加前缀。除了id字段没有被复制之外,它都可以正常工作。

这是我的XSLT

    <xsl:stylesheet version="1.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:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />
    <xsl:variable name="lowercase" select="'abcdefghijklmnopqrstuvwxyz'" />

    <xsl:template match="*">
        <xsl:element name="theprefix_{translate(local-name(), $uppercase, $lowercase)}" namespace="{namespace-uri()}">
            <xsl:apply-templates select="@*|node()[not(self::unique_id)]"/>
        </xsl:element>
    </xsl:template>


    <xsl:template match="@*">
        <xsl:attribute name="{translate(local-name(), $uppercase, $lowercase)}" namespace="{namespace-uri()}">
            <xsl:value-of select="."/>
        </xsl:attribute>
    </xsl:template>

    <xsl:template match="comment() | text() | processing-instruction()">
        <xsl:copy/>
    </xsl:template>

    </xsl:stylesheet>

1 个答案:

答案 0 :(得分:0)

您在XSLT示例中使用了prepared statements,所以我假设您 想要保持这个元素没有任何变化(不是unique_id)。

添加与id匹配的模板:

unique_id

并从您的代码中删除<xsl:template match="unique_id"> <xsl:copy-of select="."/> </xsl:template>

添加的模板比匹配“*”的模板更具体,所以在 [not(self::unique_id)]的情况“获胜”并且只处理任何unique_id节点。