xslt身份转换模板无法匹配

时间:2015-04-13 18:41:04

标签: xml templates xslt

我需要用不同的文本值替换xml文档中的单个数据点,同时保持xml文档完全相同。每当文档的<Cd>元素值为&#34; SACC&#34;我需要将它转换为&#34; SVGS&#34;。此站点上有许多示例使用身份转换来复制xml文档,同时应用其他模板来操作节点。我试图复制这些脚本,但无法成功调用我的第二个模板并替换&#34; SACC&#34;与&#34; SVGS&#34;。我认为这应该很容易,因为我需要替换的值和输入值都是静态的。这是我的xml:

<?xml version="1.0" encoding="utf-8"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03">
    <CstmrCdtTrfInitn>
        <PmtInf>
            <DbtrAcct>
                <Tp>
                    <Cd>SACC</Cd>
                </Tp>
                <Ccy>JPY</Ccy>
                <Nm>Company</Nm>
            </DbtrAcct>
            <CdtTrfTxInf>
                <CdtrAcct>
                    <Tp>
                        <Cd>SACC</Cd>
                    </Tp>
                    <Ccy>JPY</Ccy>
                    <Nm>Person Name</Nm>
                </CdtrAcct>
            </CdtTrfTxInf>
        </PmtInf>
    </CstmrCdtTrfInitn>
</Document>

我特意试图取代第二个&#34; SACC&#34;仅在离开第一个&#34; SACC&#34;时<CdtTrfTxInf/CdtrAcct/Tp/Cd>中包含的值价值不变。这是我想要的xml输出:

<?xml version="1.0" encoding="utf-8"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03">
    <CstmrCdtTrfInitn>
        <PmtInf>
            <DbtrAcct>
                <Tp>
                    <Cd>SACC</Cd>
                </Tp>
                <Ccy>JPY</Ccy>
                <Nm>Company</Nm>
            </DbtrAcct>
            <CdtTrfTxInf>
                <CdtrAcct>
                    <Tp>
                        <Cd>SVGS</Cd>
                    </Tp>
                    <Ccy>JPY</Ccy>
                    <Nm>Person Name</Nm>
                </CdtrAcct>
            </CdtTrfTxInf>
        </PmtInf>
    </CstmrCdtTrfInitn>
</Document>

这是我到目前为止创建的xslt无法正常工作。身份转换复制原始的xml文档,但替换文本值的模板没有做任何事情。结果是我最终得到了原始xml文档的精确,未更改的副本。我还试图在没有&#34; *&#34;我的匹配表达式中的通配符和没有text()参数但仍具有相同输出的表达式。关于为什么我的xpath不匹配或完全采用新方法的建议将不胜感激。此外,xml文档的空格和空格不受干扰至关重要,因为最终输出将用于将xml传输到金融机构,这些机构对于它们接受的格式非常不灵活。提前谢谢。

XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">


    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>  
    </xsl:template>

    <xsl:template match="*/CdtrAcct/Tp/Cd/text()[.='SACC']">SVGS</xsl:template>

</xsl:stylesheet>

1 个答案:

答案 0 :(得分:0)

如果您使用的是XSLT 2.0处理器,则可以通过将xpath-default-namespace="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03"放在xsl:stylesheet元素上来修复样式表。