【发布时间】:2016-08-06 05:56:51
【问题描述】:
XML/XPath/XSLT 问题。我有一个曾曾祖父节点,它应该推动更深孙节点的价值。应复制所有其他节点
这是 XML(来自供应商,我无法控制格式)
付款类型(位于 PmtInf/PmtTpInf/LclInstrm/Cd 值可以是 ABC 或 XYZ,基于该值,PmtInf/Dbtr/Id/OrgId/Othr/Id 值应为 111111111 或 222222222
我可以像xslt一样成功匹配
<xsl:template match="CstmrCdtTrfInitn/PmtInf/PmtTpInf/LclInstrm[iso3:Cd='ABC']">
但我在更高级别写出的任何元素都处于同一级别(这是意料之中的)
如果我匹配较低的级别,我无法“找到”较高的节点值
<xsl:template match="PmtInf/Dbtr/Id/OrgId/Othr">
我尝试将值设置为要比较的变量,我尝试使用 xslt 之类的
"../../../../PmtInf/PmtTpInf/LclInstrm/Cd = 'ABC'"
或
xpath"//Id/ancestor::LclInstrm[1]"
<?xml version="1.0" encoding="utf-8"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03">
<CstmrCdtTrfInitn>
<GrpHdr>
<MsgId>1302</MsgId>
<CreDtTm>2016-04-06T08:30:44.533-07:00</CreDtTm>
<NbOfTxs>2</NbOfTxs>
<CtrlSum>0000.000</CtrlSum>
<InitgPty>
<Nm>NAME</Nm>
<Id>
<OrgId>
<Othr>
<Id>SPECIALID</Id>
<SchmeNm>
<Prtry>CUST</Prtry>
</SchmeNm>
</Othr>
</OrgId>
</Id>
</InitgPty>
</GrpHdr>
<PmtInf>
<PmtInfId>IDNUMBER</PmtInfId>
<PmtMtd>TRF</PmtMtd>
<BtchBookg>false</BtchBookg>
<NbOfTxs>2</NbOfTxs>
<CtrlSum>0000.00</CtrlSum>
<PmtTpInf>
<InstrPrty>NORM</InstrPrty>
<SvcLvl>
<Cd>NURG</Cd>
</SvcLvl>
<LclInstrm>
<Cd>ABC</Cd><!-- This is the payment type, can be ABC or XYZ this value drives the Dbtr/Id/OrgId/Othr/Id value-->
</LclInstrm>
</PmtTpInf>
<ReqdExctnDt>2016-04-06-07:00</ReqdExctnDt>
<Dbtr>
<Nm>NAME</Nm>
<PstlAdr>
<AdrTp>ADDR</AdrTp>
<PstCd>ZIP</PstCd>
<TwnNm>CITY</TwnNm>
<CtrySubDvsn>STATE</CtrySubDvsn>
<Ctry>US</Ctry>
<AdrLine>ADDRESS1</AdrLine>
<AdrLine>ADDRESS2</AdrLine>
</PstlAdr>
<Id>
<OrgId>
<Othr>
<Id>1234567890</Id><!-- This field changes based on payment type field above. If ABC, 111111111 if XYZ 222222222 -->
<SchmeNm>
<Cd>CHID</Cd>
</SchmeNm>
</Othr>
</OrgId>
</Id>
</Dbtr>
</PmtInf>
</CstmrCdtTrfInitn>
</Document>
所需的输出将具有相同的节点/格式,但此处的值会发生变化
<Id>
<OrgId>
<Othr>
<Id>111111111 (or 222222222 based on ancestor)</Id>
<SchmeNm>
<Cd>CHID</Cd>
</SchmeNm>
</Othr>
</OrgId>
</Id>
【问题讨论】:
-
您的 XML 文档位于 命名空间 中(查找)。这意味着您的模板不匹配任何内容(与您声称的相反),同样您的选择表达式也没有选择任何内容。 --附言选择祖先节点的简单方法是使用祖先轴。或者只是从根开始(假设只有一个
CstmrCdtTrfInitn节点)。 -
你想要的输出是什么?
-
我从 xslt 中删除了命名空间以尝试整理帖子。它在里面。我可以编辑和添加。
-
但是您没有从 XML 中删除它,所以这只是造成混乱的原因。我也没有看到“PPD”值。