如何在不删除命名空间声明的情况下删除命名空间名称

时间:2018-10-17 16:58:25

标签: xslt

我对XSLT还是很陌生,我拥有以下XML,需要删除命名空间。我还发现以下XSLT几乎可以完成工作,但它不会保留xmlns声明。

XML:

<?xml version="1.0" encoding="UTF-8"?>
<etd_ms:thesis xmlns:etd_ms="http://www.ndltd.org/standards/metadata/etdms/1.0/"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://www.ndltd.org/standards/metadata/etdms/1.0/ http://www.ndltd.org/standards/metadata/etdms/1.0/etdms.xsd">
   <etd_ms:title>Aspects of negritude in the works of two Harlem renaissance authors : Claude McKay and Langston Hughes</etd_ms:title>
   <etd_ms:creator>Charles, Asselin</etd_ms:creator>
   <etd_ms:subject/>
   <etd_ms:publisher>Concordia University</etd_ms:publisher>
   <etd_ms:contributor role="advisor">Butovsky, M</etd_ms:contributor>
   <etd_ms:date>1980</etd_ms:date>
   <etd_ms:type>Electronic Thesis or Dissertation</etd_ms:type>
   <etd_ms:identifier>TC-QMG-1</etd_ms:identifier>
   <etd_ms:format>text</etd_ms:format>
   <etd_ms:identifier>https://spectrum.library.concordia.ca/1/1/MK49585.pdf</etd_ms:identifier>
   <etd_ms:language>en</etd_ms:language>
   <etd_ms:degree>
      <etd_ms:name>M.A.</etd_ms:name>
      <etd_ms:level>masters</etd_ms:level>
      <etd_ms:discipline>Dept. of English</etd_ms:discipline>
      <etd_ms:grantor>Concordia University</etd_ms:grantor>
   </etd_ms:degree>
</etd_ms:thesis>

这是XSLT:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output indent="yes" method="xml" encoding="utf-8" omit-xml-declaration="no"/>

    <!-- Stylesheet to remove all namespaces from a document -->
    <!-- NOTE: this will lead to attribute name clash, if an element contains
        two attributes with same local name but different namespace prefix -->
    <!-- Nodes that cannot have a namespace are copied as such -->

    <!-- template to copy elements -->
    <xsl:template match="*">
        <xsl:element name="{local-name()}">
            <xsl:apply-templates select="@* | node()"/>
        </xsl:element>
    </xsl:template>

    <!-- template to copy attributes -->
    <xsl:template match="@*">
        <xsl:attribute name="{local-name()}">
            <xsl:value-of select="."/>
        </xsl:attribute>
    </xsl:template>

    <!-- template to copy the rest of the nodes -->
    <xsl:template match="comment() | text() | processing-instruction()">
        <xsl:copy/>
    </xsl:template>

</xsl:stylesheet>

结果如下:

<?xml version="1.0" encoding="UTF-8"?>
<thesis xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.ndltd.org/standards/metadata/etdms/1.0/ http://www.ndltd.org/standards/metadata/etdms/1.0/etdms.xsd">
   <title>Aspects of negritude in the works of two Harlem renaissance authors : Claude McKay and Langston Hughes</title>
   <creator>Charles, Asselin</creator>
   <subject/>
   <publisher>Concordia University</publisher>
   <contributor role="advisor">Butovsky, M</contributor>
   <date>1980</date>
   <type>Electronic Thesis or Dissertation</type>
   <identifier>TC-QMG-1</identifier>
   <format>text</format>
   <identifier>https://spectrum.library.concordia.ca/1/1/MK49585.pdf</identifier>
   <language>en</language>
   <degree>
      <name>M.A.</name>
      <level>masters</level>
      <discipline>Dept. of English</discipline>
      <grantor>Concordia University</grantor>
   </degree>
</thesis>

几乎到了,除了我需要保留xmlns声明外,因此根元素最终应该是这样的:

<thesis xmlns="http://www.ndltd.org/standards/metadata/etdms/1.0/"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.ndltd.org/standards/metadata/etdms/1.0/ http://www.ndltd.org/standards/metadata/etdms/1.0/etdms.xsd">

有人可以帮助我解决此问题吗?谢谢。

1 个答案:

答案 0 :(得分:1)

更改

<xsl:element name="{local-name()}">

<xsl:element name="{local-name()}" namespace="http://www.ndltd.org/standards/metadata/etdms/1.0/">
相关问题