簡體   English   中英

如何使用XSL從原始XML文檔中刪除名稱空間並僅保留其中的某些元素?

[英]how to remove namespace and retain only some of the elements from the original XML document using XSL?

下面是我的XML。 我想使用XSL對此進行解析。 我要實現的是刪除名稱空間(xmlns),然后僅保留一些元素及其屬性。 我找到了一種刪除名稱空間的方法,但是當我將其與代碼結合在一起以保留某些元素時,它不起作用。 我已經嘗試過該身份,但仍然無法使用。

我希望外面的人可以分享一些東西。 提前非常感謝您。

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>
<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. 第二個模板匹配所有非元素的節點並將其復制到輸出,不包括文檔節點/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM