我需要用不同的文本值替换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>
答案 0 :(得分:0)
如果您使用的是XSLT 2.0处理器,则可以通过将xpath-default-namespace="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03"
放在xsl:stylesheet
元素上来修复样式表。