【发布时间】:2015-04-13 18:41:03
【问题描述】:
我需要用不同的文本值替换 xml 文档中的单个数据点,同时保持 xml 文档完全相同。每当文档具有“SACC”的<Cd> 元素值时,我需要将其转换为“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>
【问题讨论】:
-
这是一个 命名空间 问题 - 请参阅此处如何解决它:stackoverflow.com/questions/26085859/…
-
感谢迈克尔的反馈。我查看了您发布的链接,它很好地涵盖了命名空间问题。