XSLT根据父子元素的值删除子元素
我正在尝试使用此处 https://stackoverflow.com/a/10629806/ 662877
转换为其他XML,但未获得预期的输出。
to a different XML but not getting the intended output.
如果// TERR = KHM6,然后从输入中删除/剥离这两个元素 CreatePaymentItems 和 CreatePayExt 并生成输出。
有人可以告诉我我在这里缺少什么。
If //TERR="KHM6" then remove/strip these 2 elements CreatePaymentItems and CreatePayExt from the input and generate an output. Can someone tell me what I am missing here.
谢谢
XSLT:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match=
"*[../TERR='KHM6']/CreatePaymentItems | *[../TERR='KHM6']/CreatePayExt"/>
</xsl:stylesheet>
示例输入XML:
<ns0:DocTran doctype="Return" xmlns:ns0="http://test.Schemas.Out_Return">
<TransactionType>
<PayLineItems>
<PayLineInsert>
<PAYTYPE>4</PAYTYPE>
<NUMBER>R2293416</NUMBER>
<SERIAL>3335889530</SERIAL>
<DOCDATE>05/03/2012</DOCDATE>
<ITEMNMBR>4NZ3330000010</ITEMNMBR>
<UNITPRCE>599.99</UNITPRCE>
<XTNDPRCE>599.99</XTNDPRCE>
<QUANTITY>1</QUANTITY>
<TAXAMNT>43.65</TAXAMNT>
<QTYONHND>1</QTYONHND>
<TERR>KHM6</TERR>
</PayLineInsert>
</PayLineItems>
<PayLineEXT>
<PAYTYPE>4</PAYTYPE>
<NUMBER>R2293416</NUMBER>
<LNITMSEQ>2293416</LNITMSEQ>
</PayLineEXT>
<CreatePaymentItems>
<CreatePaymentInsertRecord>
<INTERID>TOTM</INTERID>
<PAYTYPE>4</PAYTYPE>
<PAYNUMBER>R2293416</PAYNUMBER>
<DOCDATE>05/03/2012</DOCDATE>
<DOCAMOUNT>645.03</DOCAMOUNT>
<DOCNUMBER>2293416</DOCNUMBER>
</CreatePaymentInsertRecord>
</CreatePaymentItems>
<CreatePayExt>
<PAYTYPE>4</PAYTYPE>
<PAYNUMBER>R2293416</PAYNUMBER>
<SEQNUMBR>61261585</SEQNUMBR>
</CreatePayExt>
</TransactionType>
</ns0:DocTran>
预期的输出XML:
<ns0:DocTran doctype="Return" xmlns:ns0="http://test.Schemas.Out_Return">
<TransactionType>
<PayLineItems>
<PayLineInsert>
<PAYTYPE>4</PAYTYPE>
<NUMBER>R2293416</NUMBER>
<SERIAL>3335889530</SERIAL>
<DOCDATE>05/03/2012</DOCDATE>
<ITEMNMBR>4NZ3330000010</ITEMNMBR>
<UNITPRCE>599.99</UNITPRCE>
<XTNDPRCE>599.99</XTNDPRCE>
<QUANTITY>1</QUANTITY>
<TAXAMNT>43.65</TAXAMNT>
<QTYONHND>1</QTYONHND>
<TERR>KHM6</TERR>
</PayLineInsert>
</PayLineItems>
<PayLineEXT>
<PAYTYPE>4</PAYTYPE>
<NUMBER>R2293416</NUMBER>
<LNITMSEQ>2293416</LNITMSEQ>
</PayLineEXT>
</TransactionType>
</ns0:DocTran>
问题在这里 :
*[../TERR='KHM6']/CreatePaymentItems
这与具有同级 TERR的元素的
CreatePaymentItems
子元素匹配/ code>的值为 KHM6
。
This matches the CreatePaymentItems
child of an element that has a sibling TERR
with value "KHM6"
.
但是所有的兄弟姐妹提供的XML文档中的TERR
没有孩子。
这是您想要的转换:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match=
"*[PayLineItems/*/TERR = 'KHM6']
/*[self::CreatePaymentItems or self::CreatePayExt]"/>
</xsl:stylesheet>
应用于提供的XML文档时(已更正,格式正确) ):
when applied on the provided XML document (corrected to be well-formed):
<ns0:DocTran doctype="Return" xmlns:ns0="http://test.Schemas.Out_Return">
<TransactionType>
<PayLineItems>
<PayLineInsert>
<PAYTYPE>4</PAYTYPE>
<NUMBER>R2293416</NUMBER>
<SERIAL>3335889530</SERIAL>
<DOCDATE>05/03/2012</DOCDATE>
<ITEMNMBR>4NZ3330000010</ITEMNMBR>
<UNITPRCE>599.99</UNITPRCE>
<XTNDPRCE>599.99</XTNDPRCE>
<QUANTITY>1</QUANTITY>
<TAXAMNT>43.65</TAXAMNT>
<QTYONHND>1</QTYONHND>
<TERR>KHM6</TERR>
</PayLineInsert>
</PayLineItems>
<PayLineEXT>
<PAYTYPE>4</PAYTYPE>
<NUMBER>R2293416</NUMBER>
<LNITMSEQ>2293416</LNITMSEQ>
</PayLineEXT>
<CreatePaymentItems>
<CreatePaymentInsertRecord>
<INTERID>TOTM</INTERID>
<PAYTYPE>4</PAYTYPE>
<PAYNUMBER>R2293416</PAYNUMBER>
<DOCDATE>05/03/2012</DOCDATE>
<DOCAMOUNT>645.03</DOCAMOUNT>
<DOCNUMBER>2293416</DOCNUMBER>
</CreatePaymentInsertRecord>
</CreatePaymentItems>
<CreatePayExt>
<PAYTYPE>4</PAYTYPE>
<PAYNUMBER>R2293416</PAYNUMBER>
<SEQNUMBR>61261585</SEQNUMBR>
</CreatePayExt>
</TransactionType>
</ns0:DocTran>
产生了所需的正确结果:
<ns0:DocTran xmlns:ns0="http://test.Schemas.Out_Return" doctype="Return">
<TransactionType>
<PayLineItems>
<PayLineInsert>
<PAYTYPE>4</PAYTYPE>
<NUMBER>R2293416</NUMBER>
<SERIAL>3335889530</SERIAL>
<DOCDATE>05/03/2012</DOCDATE>
<ITEMNMBR>4NZ3330000010</ITEMNMBR>
<UNITPRCE>599.99</UNITPRCE>
<XTNDPRCE>599.99</XTNDPRCE>
<QUANTITY>1</QUANTITY>
<TAXAMNT>43.65</TAXAMNT>
<QTYONHND>1</QTYONHND>
<TERR>KHM6</TERR>
</PayLineInsert>
</PayLineItems>
<PayLineEXT>
<PAYTYPE>4</PAYTYPE>
<NUMBER>R2293416</NUMBER>
<LNITMSEQ>2293416</LNITMSEQ>
</PayLineEXT>
</TransactionType>
</ns0:DocTran>