【问题标题】:Remove ns0 and ns1 prefix and include a new prefix in all tags with XSL移除 ns0 和 ns1 前缀,并在所有带有 XSL 的标签中包含一个新前缀
【发布时间】:2019-01-16 19:23:32
【问题描述】:

我需要帮助来创建 XSLT 映射,以删除所有前缀 ns(NS0、NS1 等)并在所有标签中包含一个新前缀。

下面以 XML de 输入输出为例。

输入

<ns0:ExecuteMultipleOperations xmlns:ns0="http://www.example.com">
    <ns0:Operations>
        <ns0:Operation>
            <ns0:Action>Create</ns0:Action>
            <ns0:Object>
                <ns1:SOUser xmlns:ns1="http://www.example.com">
                    <ns1:FullName>My Full Name</ns1:FullName>
                    <ns1:EmailAddress>name@fake.mail</ns1:EmailAddress>
                    <ns1:Active>1</ns1:Active>
                </ns1:SOUser>
            </ns0:Object>
        </ns0:Operation>
    </ns0:Operations>
    <ns0:OneTransaction>true</ns0:OneTransaction>
    <ns0:ContinueOnError>true</ns0:ContinueOnError>
</ns0:ExecuteMultipleOperations>

输出

<clic:ExecuteMultipleOperations xmlns:clic="http://www.example.com">
    <clic:Operations>
        <clic:Operation>
            <clic:Action>Create</clic:Action>
            <clic:Object>
                <clic:SOUser>           
                    <clic:FullName>My Full Name</clic:FullName>
                    <clic:EmailAddress>name@fake.mail</clic:EmailAddress>
                    <clic:Active>1</clic:Active>
                </clic:SOUser>
            </clic:Object>
        </clic:Operation>
    </clic:Operations>
    <clic:OneTransaction>true</clic:OneTransaction>
    <clic:ContinueOnError>true</clic:ContinueOnError>
</clic:ExecuteMultipleOperations>

有什么建议吗?

【问题讨论】:

  • **注意:**考虑一下您为什么关心命名空间前缀。如果是因为您只是希望它看起来一致,那很好,但如果是因为某些东西出现故障并且除非使用 clic 前缀否则无法正常工作,那就是一种气味。他们很可能是在做某种骇人听闻的字符串解析,而不是使用 XML 工具和 API 来识别它们所绑定的命名空间的元素。

标签: xml xslt transformation


【解决方案1】:

请尝试下面的 XSLT,它匹配具有前缀 ns0ns1 的所有元素,并将它们的名称替换为 clic 前缀。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:clic="http://www.example.com" 
    xmlns:ns0="http://www.example.com"
    xmlns:ns1="http://www.example.com">
    <xsl:output method="xml" />
    <xsl:strip-space elements="*" />

     <xsl:template match="ns0:* | ns1:*">
        <xsl:element name="clic:{local-name()}">
            <xsl:apply-templates select="@* | node()" />
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

输出

<clic:ExecuteMultipleOperations xmlns:clic="http://www.example.com">
    <clic:Operations>
        <clic:Operation>
            <clic:Action>Create</clic:Action>
            <clic:Object>
                <clic:SOUser>
                    <clic:FullName>My Full Name</clic:FullName>
                    <clic:EmailAddress>name@fake.mail</clic:EmailAddress>
                    <clic:Active>1</clic:Active>
                </clic:SOUser>
            </clic:Object>
        </clic:Operation>
    </clic:Operations>
    <clic:OneTransaction>true</clic:OneTransaction>
    <clic:ContinueOnError>true</clic:ContinueOnError>
</clic:ExecuteMultipleOperations>

【讨论】:

  • 请注意,XSLT 1.0 不保证此样式表的输出将使用前缀“clic”,尽管许多 XSLT 1.0 处理器可能会提供所需的结果。 XSLT 2.0 确实保证将使用前缀“clic”。
猜你喜欢
  • 2011-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-04
相关资源
最近更新 更多