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命名空间?
答案 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>
。