xml - 使用 xslt 重命名元素

标签 xml xslt parameters xml-namespaces

我有这个 xml:

<pos:getPositionRouter xmlns:pos="positionNS">
   <positionID>
      <code>1</code>
   </positionID>
   <parameter>?</parameter>
</pos:getPositionRouter>

我想使用 xslt 将元素 pos:getPositionRouter 重命名为 x:getPosition:

<x:getPosition xmlns:x="newPositionNS">
   <positionID>
      <code>1</code>
   </positionID>
   <parameter>?</parameter>
</x:getPosition>

这是我想出的样式表:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsl:output method="xml" omit-xml-declaration="yes" indent="yes" />

 <xsl:param name="old_namespace" />
 <xsl:param name="old_element_localname" />
 <xsl:param name="new_namespace" />
 <xsl:param name="new_element_localname" />


 <xsl:template match="@*|node()">
  <xsl:choose>
   <xsl:when test="(local-name() = $old_element_localname) and (namespace-uri() = $old_namespace)">
    <xsl:element name="{$new_element_localname}" namespace="{$new_namespace}">
     <xsl:apply-templates select="@*|node()"/>
    </xsl:element>
   </xsl:when>

   <!-- copy the rest as is -->
   <xsl:otherwise>
    <xsl:copy>
     <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
   </xsl:otherwise>
  </xsl:choose>
 </xsl:template>

</xsl:stylesheet> 

我被迫使用 xalan 作为 xslt 处理器,不幸的是输出是这样的:

<getPosition xmlns="newPositionNS">
   <positionID xmlns:pos="positionNS">
      <code>1</code>
   </positionID>
   <parameter xmlns:pos="positionNS">?</parameter>
</getPosition>

getPosition 元素的默认命名空间成为新的命名空间,但子元素应保持没有命名空间 (xmlns="")。

有人能理解为什么吗?

谢谢!

最佳答案

这个样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:param name="old_namespace" select="'positionNS'"/>
    <xsl:param name="old_element_localname" select="'getPositionRouter'"/>
    <xsl:param name="new_namespace_prefix" select="'x'"/>
    <xsl:param name="new_namespace" select="'newPositionNS'"/>
    <xsl:param name="new_element_localname" select="'getPosition'" />
    <xsl:template match="*">
        <xsl:choose>
            <xsl:when test="local-name()=$old_element_localname and
                            namespace-uri()=$old_namespace">
                <xsl:element
                     name="{substring(concat($new_namespace_prefix,':'),
                                      1 div boolean($new_namespace_prefix))}{
                            $new_element_localname}"
                     namespace="{$new_namespace}">
                    <xsl:apply-templates select="@*|node()"/>
                </xsl:element>
            </xsl:when>
            <xsl:otherwise>
                <xsl:element name="{name()}">
                    <xsl:apply-templates select="@*|node()"/>
                </xsl:element>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
    <xsl:template match="@*">
        <xsl:attribute name="{name()}">
            <xsl:value-of select="."/>
        </xsl:attribute>
    </xsl:template>
</xsl:stylesheet>

输出:

<x:getPosition xmlns:x="newPositionNS">
    <positionID>
        <code>1</code>
    </positionID>
    <parameter>?</parameter>
</x:getPosition>

注意:如果您需要特定的前缀,您应该将其添加到 QName。如果您想删除范围内的命名空间,则不应在 XSLT 1.0 中使用 xsl:copy

关于xml - 使用 xslt 重命名元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4216549/

相关文章:

python - 如何从 XML 和 XSLT 获取 HTML 文件

java - main 函数可以使用 String 而不是 String[]

xml - XPATH:使用IMPORTXML计数字符串的出现

.net - 如何在 Xml 序列化、DataContractSerializer 和 LINQ to XML 之间进行选择以序列化简单对象树?

xml - 基于属性的XPath节点元素索引

java - 如何强制 javax xslt 转换器使用 utf-8 而不是 html 实体对国家字符进行编码?

xml - 用 XSLT 替换节点文本?

c++ - 何时使用右值引用

bash - 将 bash 脚本参数传递给子进程不变

java - JAXB 解码问题