处理具有不同命名空间的根节点

时间:2014-04-14 00:59:09

标签: xml xslt xslt-1.0

XSLT 1.0。

源XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<playlist xmlns="http://xspf.org/ns/0/" version="1">
    <trackList>
        <track>
            <location>1/Kosheen/Independence/01;Addict.flac</location>
            <title>Addict</title>
            <creator>Kosheen</creator>
            <album>Independence</album>
            <duration>286000</duration>
            <image>1/Kosheen/Independence/cover.jpg</image>
        </track>
    </trackList>
</playlist>

XSLT样式表文件:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" encoding="utf-8" omit-xml-declaration="no" indent="no" />

    <xsl:template match="/playlist/trackList">
        <tracks>
            <xsl:apply-templates select="track"/>
        </tracks>
    </xsl:template>

    <xsl:template match="/playlist/trackList/track">
        <track>
            <xsl:copy-of select="location"/>
            <xsl:copy-of select="title"/>
            <xsl:copy-of select="creator"/>
            <xsl:copy-of select="album"/>
        </track>
    </xsl:template>

</xsl:stylesheet>

除非我从根xmlns节点中删除playlist属性,否则不会应用样式表中的模板。

我希望输出XML文件没有XSPF命名空间。

我应该如何更新样式表来处理根节点的xspf命名空间?

1 个答案:

答案 0 :(得分:2)

您需要为命名空间添加声明并指定前缀,以便引用源文档中的元素:

xmlns:ns1="http://xspf.org/ns/0/"

由于结果文档也在同一名称空间中,因此您也将其声明为默认名称空间:

xmlns="http://xspf.org/ns/0/"

现在,您可以使用前缀ns1:playlist来引用源XML中的元素。

以下是添加了名称空间的样式表:

<xsl:stylesheet 
    xmlns="http://xspf.org/ns/0/" 
    xmlns:ns1="http://xspf.org/ns/0/"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    exclude-result-prefixes="ns1"
    version="1.0">

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

    <xsl:template match="/ns1:playlist/ns1:trackList">
        <tracks>
            <xsl:apply-templates select="ns1:track"/>
        </tracks>
     </xsl:template>
    <xsl:template match="/ns1:playlist/ns1:trackList/ns1:track">
        <track>
            <xsl:copy-of select="ns1:location"/>
            <xsl:copy-of select="ns1:title"/>
            <xsl:copy-of select="ns1:creator"/>
            <xsl:copy-of select="ns1:album"/>
        </track>
    </xsl:template>
</xsl:stylesheet>

<强>更新

如果您的结果必须在no-namespace,则可以删除未加前缀的xmlns,但您无法使用副本(因为它会复制整个节点,包括名称空间 - xmlns声明将出现在每个节点中)。如果您的子元素只有文本,您可以替换:

<xsl:copy-of select="ns1:location"/>

<location><xsl:value-of select="ns1:location"/></location>

然后,您可以从xmlns删除默认<xsl:stylesheet>