如何使用xslt更改父标记中的元素文本

时间:2014-07-10 05:32:53

标签: xslt

我想用xslt替换元素标记名称。我有这样的输出:

<gl-cor:documentInfo>
    <gl-cor:entriesType contextRef="journal_context">DocumentID</gl-cor:entriesType>
    <gl-cor:uniqueID contextRef="journal_context">RevisionID</gl-cor:uniqueID>
</gl-cor:documentInfo>
<gl-cor:entityInformation>
    <gl-cor:entityPhoneNumber>
        <gl-cor:phoneNumber contextRef="journal_context">779633</gl-cor:phoneNumber>
    </gl-cor:entityPhoneNumber>
    <gl-cor:entityFaxNumberStructure>
        <gl-cor:entityFaxNumbercontextRef="journal_context">1234-56-89</gl-cor:entityFaxNumber>
    </gl-cor:entityFaxNumberStructure>
</gl-cor:entityInformation>

而且,我希望我的输出看起来像这样:

<gl-cor:documentInfo>
    <gl-cor:entriesType contextRef="journal_context">DocumentID</gl-cor:entriesType>
    <gl-bus:uniqueID contextRef="journal_context">RevisionID</gl-cor:uniqueID>
</gl-cor:documentInfo>
<gl-cor:entityInformation>
    <gl-bus:entityPhoneNumber>
        <gl-bus:phoneNumber contextRef="journal_context">779633</gl-bus:phoneNumber>
    </gl-bus:entityPhoneNumber>
    <gl-bus:entityFaxNumberStructure>
        <gl-bus:entityFaxNumbercontextRef="journal_context">1234-56-89</gl-bus:entityFaxNumber>
    </gl-bus:entityFaxNumberStructure>
</gl-cor:entityInformation>

<gl-cor:entityInformation>的所有孩子都应该替换gl-cor,它应该是gl-bus。有可能这样做吗?

我尝试创建一个示例xslt,但它没有用。错误发生在<gl-bus:phoneNumber>,因为我认为它包含一个特殊字符?喜欢&#34; - &#34;和&#34;:&#34;。

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

<xsl:template match="gl-cor:entityInformation/gl-cor:entityPhoneNumber/gl-cor:phoneNumber">
<gl-bus:phoneNumber>
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</gl-bus:phoneNumber>
</xsl:template>

有人可以帮我解决这个问题吗?非常感谢。

1 个答案:

答案 0 :(得分:0)

首先,gl-corgl-bus是名称空间前缀。命名空间前缀在XML元素之前写入,并与具有:的XML元素分开。所以你的问题不是因为字符-:,这些都是有效的字符,请阅读这些文章/教程:

http://www.w3schools.com/xml/xml_namespaces.asp http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references#Predefined_entities_in_XML

要回答您的问题,我们需要知道gl-corgl-bus的namspace URI是什么,但它应该如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:gl-cor="http://example.org/gl-cor" xmlns:gl-bus="http://example.org/gl-bus">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

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

    <xsl:template match="*[ancestor::gl-cor:entityInformation]">
        <xsl:element name="gl-bus:{local-name()}">
            <xsl:apply-templates select="@*|node()" />
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

模板*[ancestor::gl-cor:entityInformation]将匹配gl-cor:entityInformation的所有(大)子项。

注意

应更新XSLT中的命名空间并与输入XML匹配:

xmlns:gl-cor="http://example.org/gl-cor"
xmlns:gl-bus="http://example.org/gl-bus"