2014-02-05 3 views
0

Вот XML, который я, применяя xsl, хочу вставить новый узел внутри узла element/element. См. Ниже вывод im, получающий сейчас, и ожидаемый результат. также i m, вставляющий xsl i, используемый для вывода узлов в качестве вывода. Предоставьте chaneg для 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:element и element - это совершенно разные элементы.

Кстати,

  • вам не нужно, чтобы выбрать все атрибуты (@*), потому что они не совпадают в любом случае.
  • в вашем контексте (соответствие шаблона для детей 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 означает щелчок на тике ответа, чтобы он отображался зеленым цветом - спасибо! –

Смежные вопросы