我正在尝试使用此处https://stackoverflow.com/a/10629806/662877
中使用的相同逻辑到另一个XML但没有得到预期的输出。
如果// TERR =“KHM6”,则从输入中删除/删除这两个元素 CreatePaymentItems 和 CreatePayExt 并生成输出。 有人能告诉我这里缺少什么。
由于
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>
答案 0 :(得分:2)
问题在于:
*[../TERR='KHM6']/CreatePaymentItems
这与具有值CreatePaymentItems
的兄弟TERR
的元素的"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文档(更正格式正确):
<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>