2014-02-05 75 views
0

這裏是我有的XML,通過應用xsl我想在元素/元素節點內插入一個新節點。見下面的輸出即時獲得和預期的輸出。我也粘貼我用來獲取節點作爲輸出的xsl。請提供一個xsl的鏈接,以便它可以插入一個新節點並在層次中顯示相同的節點。插入新節點

請提供您的寶貴意見。

XML:

<?xml version="1.0" encoding="UTF-8"?> 
<plans xmlns="http://test.org/schema/product/v1"> 
<plan effDate="2013-07-01" endDate="9999-12-31" id="MD4" source="PDM" state="RELEASED" version="I.8" vertical="MEDICAL"> 
    <!--Generated by: GeneratePDMCanonical ver. 16.4--> 
    <!--Codeset version 1.6--> 
    <!--Generated by: FilterPDM ver. 8--> 
    <ids WINDCHILL="MD0000002524"> 
     <id type="WINDCHILL">1</id> 
     <id type="BOC">1</id> 
    </ids> 
    <planInfo> 
     <productInfo source="PDM"> 
      <claimAdjudicationBeginDate>2013-07-01</claimAdjudicationBeginDate> 
      <items> 
       <!--Unmapped items--> 
       <item name="baselineId">000000</item> 
      </items> 
      <indicators> 
       <indicator type="HSAQualified">false</indicator> 
       <!--Unmapped indicators--> 
       <indicator type="hsaQualified">false</indicator> 
      </indicators> 
      <versionInfo> 
       <version>I</version> 
      </versionInfo> 
     </productInfo> 
     <forms> 
      <form id="FR0000001378" type="FilingForm" version="A.1"> 
       <formType>MA PPO</formType> 
       <legalEntity>Company</legalEntity> 
       <ratingState>MA</ratingState> 
       <items> 
        <!--Unmapped items--> 
        <item name="contentBaselineNumber"/> 
       </items> 
      </form> 
      <form id="1379" type="HandbookForm" version="A.1"> 
       <formType>Fully Insured</formType> 
       <formNumber/> 
      </form> 
     </forms> 
     <!--Plan Level Networks--> 
     <networks id="Plan"> 
      <network id="NT0300000029" name="Tier 3" version="A.1"> 
       <networkCode>029</networkCode> 
       <networkName>Tier 3</networkName> 
       <networkType>IN</networkType> 
       <networkLevel>3</networkLevel> 
      </network> 
     </networks> 
    </planInfo> 
    <elements> 
     <!--Plan-Level Deductibles--> 
     <element id="BN000001" parent="BN09" type="" version="A.3"> 
      <forService>Breast </forService> 
      <elementValue forService="Breast "/> 
      <!--Defined for plans with fundingArrangement: Fully Insured--> 
      <indicators> 
       <indicator type="referralRequired">false</indicator> 
       <indicator type="payAlways">false</indicator> 
      </indicators> 
      <networks ref="Plan"/> 
      <defaultCMSLocation>12</defaultCMSLocation> 
      <!--costshare applies:applyCoinsurance|applyDeductible|applyOONCoins|applyOONDeductible|applyToOOPMax--> 
      <element name="20% 1" networkType="IN" ref="C005" type="CoInsurance" version="A.7"/> 
      <element name="$1000 IN - Tier 1" networkType="IN" ref="DD0" type="Deductible" version="B.2"/> 
     </element> 
    </elements> 
</plan> 

XSL:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes" method="xml" /> 
    <xsl:strip-space elements="*" /> 

    <xsl:template match="*[*]"> 
     <xsl:copy> 
      <xsl:apply-templates select="*[*]" /> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="@*|elements/*"> 

     <xsl:copy> 
      <reference> 
       <xsl:apply-templates select="@*|elements/child::*"/> 
       </reference> 
     </xsl:copy> 

    </xsl:template> 
</xsl:stylesheet> 

輸出:

<plans xmlns="http://hphc.org/schema/product/v1"> 
    <plan> 
     <ids/> 
     <planInfo> 
     <productInfo> 
      <items/> 
      <indicators/> 
      <versionInfo/> 
     </productInfo> 
     <forms> 
      <form> 
       <items/> 
      </form> 
      <form/> 
     </forms> 
     <networks> 
      <network/> 
     </networks> 
     </planInfo> 
     <elements> 
     <element> 
      <indicators/> 
     </element> 
     </elements> 
    </plan> 
</plans> 

預期輸出:

<elements> 
      <element> 
       <indicators/> 
-- new node-- <reference/> -- new node-- 
      </element> 
     </elements> 

回答

1

只要你的模板匹配是指通配符像*

<xsl:template match="*[*]"> 

你不必擔心命名空間。但是,如果您匹配輸入XML中的特定元素,如下所示:

<xsl:template match="@*|elements/*"> 

您必須遵守指定的默認名稱空間。以下行定義了默認命名空間:

<plans xmlns="http://test.org/schema/product/v1"> 

它也被傳遞給所有子元素。換句話說,element元素也有一個名稱空間。就XSLT處理器而言,v1:elementelement是完全不同的元素。

順便說一句,

  • 你不需要選擇所有屬性(@*),因爲它們不匹配反正。
  • 在您的上下文中(elements元素的子元素的模板匹配)像elements/child::*"這樣的表達式選擇稱爲「元素」的elements元素的子元素的子元素的所有子元素。我認爲這是令人困惑的,而不是你想要的。
  • 如可從第二備註中可以看出,請避免給予像 「元件」 和 「元件」 儘可能

樣式表

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:v1="http://test.org/schema/product/v1" 
    exclude-result-prefixes="v1"> 

    <xsl:output omit-xml-declaration="yes" indent="yes" method="xml" /> 
    <xsl:strip-space elements="*" /> 

    <xsl:template match="*[*]"> 
     <xsl:copy> 
      <xsl:apply-templates select="*[*]" /> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="v1:element[*]"> 
     <xsl:copy> 
      <xsl:apply-templates select="*"/> 
      <xsl:element name="reference" namespace="http://test.org/schema/product/v1"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="text()"/> 
</xsl:stylesheet> 

輸出

<plans xmlns="http://test.org/schema/product/v1"> 
    <plan> 
     <ids/> 
     <planInfo> 
     <productInfo> 
      <items/> 
      <indicators/> 
      <versionInfo/> 
     </productInfo> 
     <forms> 
      <form> 
       <items/> 
      </form> 
      <form/> 
     </forms> 
     <networks> 
      <network/> 
     </networks> 
     </planInfo> 
     <elements> 
     <element> 
      <indicators/> 
      <reference/> 
     </element> 
     </elements> 
    </plan> 
</plans> 
元素名稱
+0

接受了解決方案 – Dhana

+0

不是真的,接受StackOv erflow意味着點擊答案勾號,使其顯示爲綠色 - 謝謝! –