XSLT基于xml值应用模板或调用模板
XML/XPath/XSLT问题。我有一个曾祖父母节点,它应该驱动更深层的孙子节点的价值。应复制所有其他节点 这是一家供应商提供的XML,我无法控制格式 位于PmtInf/PmtTpInf/LclInstrm/Cd值中的付款类型可以是ABC或XYZ,基于该值,PmtInf/Dbtr/Id/OrgId/Othr/Id值应为111111111或22222 我可以像xslt一样成功地匹配XSLT基于xml值应用模板或调用模板,xml,xslt,Xml,Xslt,XML/XPath/XSLT问题。我有一个曾祖父母节点,它应该驱动更深层的孙子节点的价值。应复制所有其他节点 这是一家供应商提供的XML,我无法控制格式 位于PmtInf/PmtTpInf/LclInstrm/Cd值中的付款类型可以是ABC或XYZ,基于该值,PmtInf/Dbtr/Id/OrgId/Othr/Id值应为111111111或22222 我可以像xslt一样成功地匹配 <xsl:template match="CstmrCdtTrfInitn/PmtInf/PmtTpInf/
<xsl:template match="CstmrCdtTrfInitn/PmtInf/PmtTpInf/LclInstrm[iso3:Cd='ABC']">
"../../../../PmtInf/PmtTpInf/LclInstrm/Cd = 'ABC'"
或
xpath//Id/祖先::LclInstrm[1]
所需的输出将具有相同的节点/格式,但此处的值将更改
<Id>
<OrgId>
<Othr>
<Id>111111111 (or 222222222 based on ancestor)</Id>
<SchmeNm>
<Cd>CHID</Cd>
</SchmeNm>
</Othr>
</OrgId>
</Id>
试着这样做:
XSLT1.0
您的XML文档位于命名空间中,请查找它。这意味着您的模板不匹配任何与您声称相反的内容,同样,您的select表达式也不选择任何内容。-另外,选择祖先节点的简单方法是使用祖先轴。或者假设只有一个CSTMRCDTRFINITN节点,从根节点开始。您想要的输出是什么?我从xslt中删除了名称空间,以尝试分离帖子。它在那里。我可以编辑和添加,但您没有将其从XML中删除,所以这只会造成混乱。我也没有看到“PPD”值。谢谢!这很有效。所有我的+1。我一直在努力使用祖先::语法,通常我在XSLT中自上而下工作,但我不知道如何在这种情况下做到这一点case@Jay是的,如果有帮助的话,请回答这个问题,并考虑接受一些你已经收到的其他好答案。谢谢。这篇文章和其他文章的答案都被接受了。很抱歉坏社区成员。
<Id>
<OrgId>
<Othr>
<Id>111111111 (or 222222222 based on ancestor)</Id>
<SchmeNm>
<Cd>CHID</Cd>
</SchmeNm>
</Othr>
</OrgId>
</Id>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns1="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="ns1:Dbtr/ns1:Id/ns1:OrgId/ns1:Othr/ns1:Id">
<xsl:variable name="cd" select="ancestor::ns1:PmtInf/ns1:PmtTpInf/ns1:LclInstrm/ns1:Cd" />
<xsl:copy>
<xsl:choose>
<xsl:when test="$cd='ABC'">111111111</xsl:when>
<xsl:when test="$cd='XYZ'">222222222</xsl:when>
</xsl:choose>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>