如何在此XML / XSLT中剥离/添加名称空间/前缀?

时间:2018-07-25 13:20:04

标签: xml xslt

给出以下XML:

<?xml version="1.0" encoding="utf-8"?>
<Store>
  <p1:Document xmlns:p1="urn:iso:std:iso:xyz">
    <p1:Class>
      Hello
      <p1:Type>
        Now
      </p1:Type>
    </p1:Class>
    <!-- more elements -->
  </p1:Document>
</Store>

我将如何编写XSLT以以下方式转换Document元素:

<?xml version="1.0" encoding="utf-8"?>
<Store>
  <Document xmlns="urn:iso:std:iso:123>
    <Class>
      Hello
      <Type>
        Now
      </Type>
    </Class>
    <!-- more elements -->
  </Document>
</Store>

如您所见,我需要复制Document元素,但需要剥离其所有名称空间声明和前缀,然后添加新的名称空间声明。

我将如何在XSL中完成此任务?

1 个答案:

答案 0 :(得分:0)

解决方案是答案的一种变体,例如
"How to remove namespace prefix leaving namespace value (XSLT)?"并应用具有mode属性的模板来仅处理Document元素的子代。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:p1="urn:iso:std:iso:xyz" version="1.0">
  <xsl:output indent="yes" method="xml" />
  <xsl:variable name="replacementNamespace" select="'urn:iso:std:iso:123'" />

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

  <!-- template to replace namespace -->
  <xsl:template match="*" mode="newNamespace">
    <xsl:element name="{local-name()}" namespace="{$replacementNamespace}">
      <xsl:apply-templates select="@*|node()" mode="newNamespace" />
    </xsl:element>
  </xsl:template>

  <!-- template to process Document element -->
  <xsl:template match="p1:Document">
    <xsl:apply-templates select="." mode="newNamespace" />
  </xsl:template>

</xsl:stylesheet>

如果在输出文档中仍然出现不需要的名称空间,请按照答案"XSL: Avoid exporting namespace definitions to resulting XML documents"中的说明进行操作,并将exclude-result-prefixes="ns0 ns1"添加到xsl:stylesheet元素中。这应该很容易摆脱一些不需要的名称空间。

如果这无济于事,则需要创建一个包含 所有 相关方面的最小,完整且可验证的示例的新问题。 。


下次至少要尝试通过在本站点上搜索答案来自行解决问题。