xslt标识转换模板不匹配



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

我特别试图替换<CdtTrfTxInf/CdtrAcct/Tp/Cd>中包含的第二个"SACC"值,同时保持第一个"SACC"值不变。这是我想要的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文档的一个精确的、未更改的副本。我还尝试在匹配表达式中不使用"*"通配符进行匹配,以及在不使用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>

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

最新更新