插入新节点

时间:2014-02-05 13:24:01

标签: xml xslt

这是我所拥有的XML,通过应用xsl我想在元素/元素节点中插入一个新节点。请参阅下面的输出即时获取和预期输出。我也粘贴了用于获取节点作为输出的xsl。请为xsl提供一个chaneg,以便它可以插入一个新节点并在层次结构中显示相同的内容。

请提供您宝贵的意见。

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 个答案:

答案 0 :(得分: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>