Копировать узлы в XSLT также копирует пространство имен для каждого элемента Узел - PullRequest
0 голосов
/ 25 апреля 2018

Это мой 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 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 голосов
/ 25 апреля 2018

xsl:copy копирует узлы с их пространствами имен.

Вам необходимо переименовать все узлы и пространства имен в их локальные имена без пространства имен. Это будет выглядеть так (замена всех ваших узлов и атрибутов соответствия)

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

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

Кроме того, ваш сопоставитель для item никогда не вызывается, потому что ваш XML имеет пространство имен по умолчанию xmlns="http://purl.org/rss/1.0/". Это означает, что каждый элемент в XML, который не имеет префикса пространства имен, является частью этого пространства имен.

Так что вам нужно объявить это пространство имен в вашем XSL тоже

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

А затем измените свой сопоставитель на

<xsl:template match="rss:item">

Кстати: если вы хотите избавиться от объявлений пространства имен, которые больше не используются, вы должны объявить пространства имен в вашем 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">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...