XSLT替换值

16

我有一个类似这样的XML文件

<?xml version="1.0" encoding="UTF-8"?>
<OMDefault xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <PrintDollarsAndCents>X</PrintDollarsAndCents>
   <MailAddrLine1>Add1</MailAddrLine1>
   <MailAddrLine2>Add2</MailAddrLine2>
</OMDefault>

我希望有一个XSLT将XML转换为这个样子

<?xml version="1.0" encoding="UTF-8"?>
<OMDefault xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <PrintDollarsAndCents>Y</PrintDollarsAndCents>
   <MailAddrLine1>Add1</MailAddrLine1>
   <MailAddrLine2>Add2</MailAddrLine2>
 </OMDefault>
请注意,如果属性为PrintDollarsAndCents且其值为'X',则'X'将被转换为'Y'。 由于我对XSLT非常陌生,请问是否有人可以帮助我? 先行致谢。

你的输出看起来与输入完全相同,我不理解你的“请注意”句子。当检测到输入中的特殊情况时,你能展示一下想要看到的输出吗?你会如何用伪代码编写特殊情况检测? - G. Ken Holman
抱歉出现错误,应该是这样的 <?xml version="1.0" encoding="UTF-8"?> <OMDefault xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <PrintDollarsAndCents>Y</PrintDollarsAndCents> <MailAddrLine1>Add1</MailAddrLine1> <MailAddrLine2>Add2</MailAddrLine2> </OMDefault> - Duy Tran
1个回答

26

基本上,您需要进行身份变换,并具有覆盖规则。

以下是转换:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

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

    <xsl:template match="PrintDollarsAndCents/text()[.='X']">Y</xsl:template>

</xsl:stylesheet>
应用于您的输入,生成以下结果:
<OMDefault xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <PrintDollarsAndCents>Y</PrintDollarsAndCents>
   <MailAddrLine1>Add1</MailAddrLine1>
   <MailAddrLine2>Add2</MailAddrLine2>
</OMDefault>

第一个模板是一个恒等变换,它完全复制输入文档。

第二个模板覆盖了作为PrintDollarsAndCents模板的子元素的文本节点值为X的节点。请注意,它发出值Y而不是其实际内容。


如果我有这样的东西<?xml version="1.0" encoding="UTF-8"?> <OMDefault xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <PrintDollarsAndCents>X</PrintDollarsAndCents> <MailAddrLine2>Add2</MailAddrLine2> </OMDefault> 我想要一个XSLT将XML转换为这个<?xml version="1.0" encoding="UTF-8"?> <OMDefault xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <PrintDollarsAndCents>Y</PrintDollarsAndCents> <MailAddrLine1>Add1</MailAddrLine1> <MailAddrLine2>Add2</MailAddrLine2> </OMDefault> - Duy Tran
@DuyTran,请更新您的问题或提出一个新的问题。在评论中阅读代码很困难。 - harpo
Harpo,有一个限制我无法全部发布。请访问此链接http://stackoverflow.com/questions/17734294/xslt-match-and-replace 谢谢。 - Duy Tran
我认为你的身份转换需要一个小小的补充。我发现它没有保留Unicode编码。添加以下内容使其对我起作用:<xsl:output encoding="UTF-8" />。 - Michael Levy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接