这是我所拥有的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>
答案 0 :(得分: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>