从XSLT中删除名称空间

时间:2014-01-03 18:53:23

标签: xml xslt

我想从xml中删除XMLNS =“http:// ......”。我正在使用以下代码从元素中删除XMLNS,但这也剥离了我不想要的elemenet前缀..请帮助......

输入:

<rss xmlns="http://www.ibm.org/wcmxml">
    <channel xmlns="">
        <title>Products WCI Feed</title>
        <link>http://www.ibm.com/feeds/sample.rss</link>
        <description>Products WCI RSS Feed</description>
        <lastBuildDate>Thu, 07 Nov 2013 11:30:00 EET</lastBuildDate>
        <ibmfs:etag xmlns:ibmfs="http://purl.org/net/ibmfeedsvc/feedsvc/1.0">FeedServiceServlet</ibmfs:etag>
        <item>
            <title>Product Name</title>
            <link>http://www.source-ECM-Domain.com/item/sample.htm</link>
            <description>Product Description</description>
            <pubDate>Thu, 07 Nov 2013 11:45:00 EET</pubDate>
            <guid>UniqieIDFromECMUpTo256Char00</guid>
            <category>/Taxonomy1/Category10/Category100</category>
            <author>author@us.ibm.com</author>
            <ibmwcm:action xmlns:ibmwcm="http://purl.org/net/ibmfeedsvc/wcm/1.0">add</ibmwcm:action>
            <ibmwcm:itemType xmlns:ibmwcm="http://purl.org/net/ibmfeedsvc/wcm/1.0">Content</ibmwcm:itemType>
            <ibmwcm:library xmlns:ibmwcm="http://purl.org/net/ibmfeedsvc/wcm/1.0">TGCS WCI Feed Service</ibmwcm:library>
            <ibmwcm:path xmlns:ibmwcm="http://purl.org/net/ibmfeedsvc/wcm/1.0">/Products</ibmwcm:path>
            <ibmwcm:displayTitle xmlns:ibmwcm="http://purl.org/net/ibmfeedsvc/wcm/1.0">ProductName</ibmwcm:displayTitle>
            <ibmwcm:authoringTemplate xmlns:ibmwcm="http://purl.org/net/ibmfeedsvc/wcm/1.0">TGCS WCI Feed Service/AT Product Info</ibmwcm:authoringTemplate>
            <ibmwcm:workflow xmlns:ibmwcm="http://purl.org/net/ibmfeedsvc/wcm/1.0" name="WFSystem">
                <ibmwcm:workflowStage>WFStageSystemPublish</ibmwcm:workflowStage>
            </ibmwcm:workflow>
            <ibmwcm:publishDate xmlns:ibmwcm="http://purl.org/net/ibmfeedsvc/wcm/1.0">Thu, 07 Nov 2013 15:14:00 EET</ibmwcm:publishDate>
            <ibmwcm:expirationDate xmlns:ibmwcm="http://purl.org/net/ibmfeedsvc/wcm/1.0">Fri, 17 Jul 2014 11:00:00 EET</ibmwcm:expirationDate>
        </item>
    </channel>
</rss>

输出:

<rss xmlns="http://www.ibm.org/wcmxml">
    <channel xmlns="">
        <title>Products WCI Feed</title>
        <link>http://www.ibm.com/feeds/sample.rss</link>
        <description>Products WCI RSS Feed</description>
        <lastBuildDate>Thu, 07 Nov 2013 11:30:00 EET</lastBuildDate>
        <etag>FeedServiceServlet</etag>
        <item>
            <title>Product Name</title>
            <link>http://www.source-ECM-Domain.com/item/sample.htm</link>
            <description>Product Description</description>
            <pubDate>Thu, 07 Nov 2013 11:45:00 EET</pubDate>
            <guid>UniqieIDFromECMUpTo256Char00</guid>
            <category>/Taxonomy1/Category10/Category100</category>
            <author>author@us.ibm.com</author>
            <action>add</action>
            <itemType>Content</itemType>
            <library>TGCS WCI Feed Service</library>
            <path>/Products</path>
            <displayTitle>ProductName</displayTitle>
            <authoringTemplate>TGCS WCI Feed Service/AT Product Info</authoringTemplate>
            <workflow name="WFSystem">
                <workflowStage>WFStageSystemPublish</workflowStage>
            </workflow>
            <publishDate>Thu, 07 Nov 2013 15:14:00 EET</publishDate>
            <expirationDate>Fri, 17 Jul 2014 11:00:00 EET</expirationDate>
        </item>
    </channel>
</rss>

期待:

<rss>
    <channel>
        <title>Products WCI Feed</title>
        <link>http://www.ibm.com/feeds/sample.rss</link>
        <description>Products WCI RSS Feed</description>
        <lastBuildDate>Thu, 07 Nov 2013 11:30:00 EET</lastBuildDate>
        <ibmfs:etag xmlns:ibmfs="http://purl.org/net/ibmfeedsvc/feedsvc/1.0">FeedServiceServlet</ibmfs:etag>
        <item>
            <title>Product Name</title>
            <link>http://www.source-ECM-Domain.com/item/sample.htm</link>
            <description>Product Description</description>
            <pubDate>Thu, 07 Nov 2013 11:45:00 EET</pubDate>
            <guid>UniqieIDFromECMUpTo256Char00</guid>
            <category>/Taxonomy1/Category10/Category100</category>
            <author>author@us.ibm.com</author>
            <ibmwcm:action>add</ibmwcm:action>
            <ibmwcm:itemType>Content</ibmwcm:itemType>
            <ibmwcm:library>TGCS WCI Feed Service</ibmwcm:library>
            <ibmwcm:path>/Products</ibmwcm:path>
            <ibmwcm:displayTitle>ProductName</ibmwcm:displayTitle>
            <ibmwcm:authoringTemplate>TGCS WCI Feed Service/AT Product Info</ibmwcm:authoringTemplate>
            <ibmwcm:workflow name="WFSystem">
                <ibmwcm:workflowStage>WFStageSystemPublish</ibmwcm:workflowStage>
            </ibmwcm:workflow>
            <ibmwcm:publishDate>Thu, 07 Nov 2013 15:14:00 EET</ibmwcm:publishDate>
            <ibmwcm:expirationDate>Fri, 17 Jul 2014 11:00:00 EET</ibmwcm:expirationDate>
        </item>
    </channel>
</rss>

使用XLST:

<xsl:stylesheet version="1.0" 
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:template match="*">
    <!-- remove element prefix -->
    <xsl:element name="{local-name()}">
      <!-- process attributes -->
      <xsl:for-each select="@*">
        <!-- remove attribute prefix -->
        <xsl:attribute name="{local-name()}">
          <xsl:value-of select="."/>
        </xsl:attribute>
      </xsl:for-each>
      <xsl:apply-templates/>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>

请帮助我根本不想在XML中使用XMLNS。

谢谢, 作者Srini

3 个答案:

答案 0 :(得分:2)

你无法完全避免使用xmlns:ibmwcm,因为没有它,带有ibmwcm前缀名称的元素不是命名空间良好的形式。但是你可以将声明提升到更高的级别,而不是在每个使用前缀的子元素上重复它。

除此之外,输入文档和预期输出文档之间唯一的语义差异在于输入中rss命名空间中的根级元素为http://www.ibm.org/wcmxml,并且在您的预期输出中它是{ {em> no 命名空间中的{1}}。所以以下内容应该足够了:

rss

这会产生以下输出:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:template match="/*">
    <rss xmlns:ibmwcm="http://purl.org/net/ibmfeedsvc/wcm/1.0">
      <xsl:copy-of select="node()" />
    </rss>
  </xsl:template>
</xsl:stylesheet>

删除了相同名称空间的所有重复声明,并删除<rss xmlns:ibmwcm="http://purl.org/net/ibmfeedsvc/wcm/1.0"> <channel> <title>Products WCI Feed</title> <link>http://www.ibm.com/feeds/sample.rss</link> <description>Products WCI RSS Feed</description> <lastBuildDate>Thu, 07 Nov 2013 11:30:00 EET</lastBuildDate> <ibmfs:etag xmlns:ibmfs="http://purl.org/net/ibmfeedsvc/feedsvc/1.0">FeedServiceServlet</ibmfs:etag> <item> <title>Product Name</title> <link>http://www.source-ECM-Domain.com/item/sample.htm</link> <description>Product Description</description> <pubDate>Thu, 07 Nov 2013 11:45:00 EET</pubDate> <guid>UniqieIDFromECMUpTo256Char00</guid> <category>/Taxonomy1/Category10/Category100</category> <author>author@us.ibm.com</author> <ibmwcm:action>add</ibmwcm:action> <ibmwcm:itemType>Content</ibmwcm:itemType> <ibmwcm:library>TGCS WCI Feed Service</ibmwcm:library> <ibmwcm:path>/Products</ibmwcm:path> <ibmwcm:displayTitle>ProductName</ibmwcm:displayTitle> <ibmwcm:authoringTemplate>TGCS WCI Feed Service/AT Product Info</ibmwcm:authoringTemplate> <ibmwcm:workflow name="WFSystem"> <ibmwcm:workflowStage>WFStageSystemPublish</ibmwcm:workflowStage> </ibmwcm:workflow> <ibmwcm:publishDate>Thu, 07 Nov 2013 15:14:00 EET</ibmwcm:publishDate> <ibmwcm:expirationDate>Fri, 17 Jul 2014 11:00:00 EET</ibmwcm:expirationDate> </item> </channel> </rss> xmlns上的rss声明。

答案 1 :(得分:0)

如果我理解正确,您希望删除任何名称空间的XML,同时保留ibmwcm:之类的前缀。

这是不可能的,也没有意义。

让我们稍微澄清一下这个问题。查看以下命名空间声明:

xmlns:ibmwcm="http://purl.org/net/ibmfeedsvc/wcm/1.0"

该指令执行以下操作:它将http://purl.org/net/ibmfeedsvc/wcm/1.0声明为XML文件中的命名空间,并且还告诉您ibmwcm用作其前缀。前缀只是编写整个命名空间的一种较短方式。所以,

<ibmwcm:workflow/>

实际上意味着:

<workflow xmlns="http://purl.org/net/ibmfeedsvc/wcm/1.0"/>

现在,你明白为什么将前缀与命名空间分开是没有意义的,因为两者都表示相同。

然而,您的XML仍有实际改进的空间。您不能完全从XML中删除命名空间声明,但您可以在文档节点(根节点)上声明它,如下所示:

<rss xmlns:ibmwcm="http://purl.org/net/ibmfeedsvc/wcm/1.0"/>

后来仅将其称为:

<ibmwcm:workflow/>

这样,您就不必多次重复命名空间,就像输入XML一样。

答案 2 :(得分:-2)

您不想删除XMLNS。没有它,XML将无法运行。它给出了用于消除元素名称歧义的命名空间。您可以通过使命名空间像这样

来删除XSL:previx
xmlns="http://www.w3.org/1999/XSL/Transform"

这是阅读名称空间的好地方

W3Schools Namespaces