XSLT中的复制节点还将名称空间复制到每个项目节点

时间:2018-04-25 12:54:37

标签: xml xslt

这是我的XML输入,无法更改并来自RSS提要 在输出中,命名空间被复制到我不想要的每个Item节点。我怎么摆脱这个?

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rdf:RDF xmlns="http://purl.org/rss/1.0/" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:hr="http://www.w3.org/2000/08/w3c-synd/#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cb="http://www.centralbanks.org/rss/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">

    <item rdf:about="/News-and-Publications/Media-Releases/2018/Chaly-Mah-joins-MAChairman.aspx">
        <title>Chaly Mah joins MAS Board of Directors; n</title>
        <link>http://www.mas.gov.sg/News-and-Publications/Media-Releases/2018/Chaly-Mah-joins-MAS-Board-of-Directors-DPM-Tharman-re-appointed-as-Chairman.aspx</link>
        <dc:date>2018-04-20 10:13 AM</dc:date>
        <description></description>
        <cb:news>
            <cb:simpleTitle>Chaly Mah joins MAS Board of Directors; </cb:simpleTitle>
            <cb:occurenceDate>2018-04-20 10:13 AM</cb:occurenceDate>
        </cb:news>
    </item>
    <item>
    </item>

</rdf:RDF>

我创建的XSLT是:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"       
     exclude-result-prefixes="rdf">

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

    <xsl:template match="rdf:RDF">
        <Records>
            <xsl:apply-templates/> 
        </Records>
    </xsl:template>

    <xsl:template match="item">
        <xsl:element name="Record">
            <xsl:apply-templates select="@* | node()" />
        </xsl:element>
    </xsl:template>

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

</xsl:stylesheet> 

在输出中,命名空间被复制到我不想要的每个Item节点。我怎么摆脱这个?

<item xmlns="http://purl.org/rss/1.0/"
      xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
      rdf:about="/News-and-Publications/Media-Releases/2018/Chaly-Mah-joins-MAS-Board-of-Directors-DPM-Tharman-re-appointed-as-Chairman.aspx">


<?xml version="1.0" encoding="UTF-8"?>
<Records>
    <item xmlns="http://purl.org/rss/1.0/"
          xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
          rdf:about="/News-and-Publications/Media-Releases/2018/Chaly-Mah-joins-MAS-Board-of-Directors-DPM-Tharman-re-appointed-as-Chairman.aspx">
        <title>Chaly Mah joins MAS Board of Directors;</title>
        <link>http://www.mas.gov.sg/News-and-Publications/as-Chairman.aspx</link>
        <dc:date xmlns:dc="http://purl.org/dc/elements/1.1/">2018-04-20 10:13 AM</dc:date>
        <description/>
        <cb:news xmlns:cb="http://www.centralbanks.org/rss/">
            <cb:simpleTitle>Chaly Mah joins MAS Board of Directors; DPM </cb:simpleTitle>
            <cb:occurenceDate>2018-04-20 10:13 AM</cb:occurenceDate>
        </cb:news>
    </item>

1 个答案:

答案 0 :(得分:1)

item使用其命名空间复制节点。

您需要将所有节点和名称空间重命名为其本地名称,而不使用名称空间。这看起来像这样(替换所有节点和属性匹配器)

xmlns="http://purl.org/rss/1.0/"

此外,永远不会调用xmlns:rss="http://purl.org/rss/1.0/" 的匹配器,因为您的XML具有默认的命名空间<xsl:template match="rss:item"> 。这意味着XML中没有名称空间前缀的每个元素都是此名称空间的一部分。

因此,您需要在 XSL

中声明此命名空间
<xsl:stylesheet version="3.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" 
    xmlns:hr="http://www.w3.org/2000/08/w3c-synd/#" 
    xmlns:dc="http://purl.org/dc/elements/1.1/" 
    xmlns:cb="http://www.centralbanks.org/rss/" 
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:rss="http://purl.org/rss/1.0/"
    exclude-result-prefixes="rdf rdfs hr dc cb rss">

然后将匹配器更改为

if

顺便说一下:如果你想摆脱不再使用的命名空间声明,你必须在XSL中声明命名空间,然后将它们添加到结果排除中

if(number == -1) { 
   break;
}