2011-09-29 40 views
0

以下是我的XML。我想用XSL解析这个。我想要实现的是删除名称空间(xmlns),然后保留一些元素及其属性。我找到了一种删除命名空间的方法,但是当我将它与代码放在一起以保留一些元素时,它不起作用。我已经尝试了身份,但仍然没有奏效。如何删除名称空间并仅使用XSL保留原始XML文档中的某些元素?

我希望有人能分享一些东西。非常感谢你提前。

XML输入:

<Transaction xmlns="http://www.test.com/rdc.xsd"> 
    <Transaction> 
     <StoreName id="aa">STORE A</StoreName> 
     <TransNo>TXN0001</TransNo> 
     <RegisterNo>REG001</RegisterNo> 
     <Items> 
      <Item id="1"> 
      <ItemID>A001</ItemID> 
      <ItemDesc>Keychain</ItemDesc> 
      </Item> 
      <Item id="2"> 
      <ItemID>A002</ItemID> 
      <ItemDesc>Wallet</ItemDesc> 
      </Item> 
     </Items> 
     <IDONTLIKETHIS_1> 
      <STOREXXX>XXX-</STOREXXX> 
      <TRANSXXX>YYY</TRANSXXX> 
     </IDONTLIKETHIS_1> 
     <IDONTLIKETHIS_2> 
      <STOREXXX>XXX-</STOREXXX> 
      <TRANSXXX>YYY</TRANSXXX> 
     </IDONTLIKETHIS_2> 
    </Transaction> 
<Transaction> 

期望的XML输出:

<Transaction> 
    <Transaction> 
     <StoreName id="aa">STORE A</StoreName> 
     <TransNo>TXN0001</TransNo> 
     <RegisterNo>REG001</RegisterNo> 
     <Items> 
      <Item id="1"> 
      <ItemID>A001</ItemID> 
      <ItemDesc>Keychain</ItemDesc> 
      </Item> 
      <Item id="2"> 
      <ItemID>A002</ItemID> 
      <ItemDesc>Wallet</ItemDesc> 
      </Item> 
     </Items> 
    </Transaction> 
<Transaction> 

代码用于去除命名空间(XMLNS):

<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> 

回答

1
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:x="http://invia.fujitsu.com/RetailDATACenter/rdc.xsd"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

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

    <xsl:template match="node()[not(self::*)]"> 
     <xsl:copy-of select="."/> 
    </xsl:template> 

    <xsl:template match="x:IDONTLIKETHIS_1 | x:IDONTLIKETHIS_2"/> 
</xsl:stylesheet> 

说明

  1. 模板匹配“*”匹配任何元素,并使用相同的名称重新创建它<xsl:element>),但不会复制任何命名空间节点。它还复制此元素的所有属性。然后,它会在所有此元素的子节点上应用模板(包括其本身 - 递归地) - 不仅是元素,还包括所有类型的子节点:元素,文本节点,处理指令和注释。

  2. 最后一个模板匹配我们不喜欢复制到输出的任何节点,并用空的模板正文完成此操作(不复制)。

  3. 第二模板相匹配,并复制到输出不在元件的所有节点,但不包括文档节点/

+0

喜dimitre这是很大的。所以基本上它做了什么,你创建了一个匹配IDONTLIKE元素并且什么也不做的模板,对吧?它取消了这些元素的复制。是否有可能做一个逻辑,只复制我喜欢的元素,而不是指定我不喜欢的元素?我为我的问题表示歉意。我对XML和XSL相当陌生。非常感谢你 – Amy

+0

另外,如果你能解释第二个模板的功能。非常感谢。 – Amy

+0

@Amy:是的,可以只匹配你喜欢的元素 - 你只需要定义它们。此刻,我只是在做这个 - 你喜欢的元素都是元素减去你不喜欢的元素:) –

相关问题