XSLT基于xml值应用模板或调用模板

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/

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/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>