标识转换XSLT
我有一个传入的XML文档。我只需要在下面的传入XML文档中修改一个元素示例标识转换XSLT,xslt,Xslt,我有一个传入的XML文档。我只需要在下面的传入XML文档中修改一个元素示例元素的值。我基本上需要检查名为的元素,如果该值没有任何连字符,它将按原样处理,如果该值包含连字符(-),那么我需要在连字符(-)之前处理该值,例如-4314141 传入的XML文档: <Message> <ID>4314141-324234</ID> <EMAIL>abc</EMAIL> </Message> 4314141-324234
元素的值。我基本上需要检查名为
的元素,如果该值没有任何连字符,它将按原样处理,如果该值包含连字符(-),那么我需要在连字符(-)之前处理该值,例如-4314141
传入的XML文档:
<Message>
<ID>4314141-324234</ID>
<EMAIL>abc</EMAIL>
</Message>
4314141-324234
abc
我使用下面的XSL来实现这一点,但它并没有按预期工作。
XSL:
让我知道我该怎么做
如果没有任何连字符,它将保持原样
这将完成您的身份复制模板
如果该值包含连字符(-),则需要在连字符(-)之前获取该值
友好建议:请小心匹配模式中的
/
。只需使用此模板覆盖身份规则:
<xsl:template match="ID/text()[contains(., '-')]">
<xsl:value-of select="substring-before(., '-')"/>
</xsl:template>
以下是完整的转换:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="ID/text()[contains(., '-')]">
<xsl:value-of select="substring-before(., '-')"/>
</xsl:template>
</xsl:stylesheet>
<Message>
<ID>4314141-324234</ID>
<EMAIL>abc</EMAIL>
</Message>
<Message>
<ID>4314141</ID>
<EMAIL>abc</EMAIL>
</Message>
应用于提供的XML文档时:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="ID/text()[contains(., '-')]">
<xsl:value-of select="substring-before(., '-')"/>
</xsl:template>
</xsl:stylesheet>
<Message>
<ID>4314141-324234</ID>
<EMAIL>abc</EMAIL>
</Message>
<Message>
<ID>4314141</ID>
<EMAIL>abc</EMAIL>
</Message>
4314141-324234
abc
生成所需的正确结果:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="ID/text()[contains(., '-')]">
<xsl:value-of select="substring-before(., '-')"/>
</xsl:template>
</xsl:stylesheet>
<Message>
<ID>4314141-324234</ID>
<EMAIL>abc</EMAIL>
</Message>
<Message>
<ID>4314141</ID>
<EMAIL>abc</EMAIL>
</Message>
4314141
abc
Hi感谢您的快速响应,解决方案没有按预期工作。我只在输出XML中获得
)如果XML输入不同(包含默认名称空间),请更新您的问题。此处有两个错误:match=“/ID”
将只匹配文档最外层的ID元素,而$ID
引用的是不存在的变量。