标识转换XSLT

标识转换XSLT,xslt,Xslt,我有一个传入的XML文档。我只需要在下面的传入XML文档中修改一个元素示例元素的值。我基本上需要检查名为的元素,如果该值没有任何连字符,它将按原样处理,如果该值包含连字符(-),那么我需要在连字符(-)之前处理该值,例如-4314141 传入的XML文档: <Message> <ID>4314141-324234</ID> <EMAIL>abc</EMAIL> </Message> 4314141-324234

我有一个传入的XML文档。我只需要在下面的传入XML文档中修改一个元素示例
元素的值。我基本上需要检查名为
的元素,如果该值没有任何连字符,它将按原样处理,如果该值包含连字符(-),那么我需要在连字符(-)之前处理该值,例如-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中获得标记的值。请检查一次并让我知道。@user5458829-请参阅。(注意,没有与原始样式表中相同的
)如果XML输入不同(包含默认名称空间),请更新您的问题。此处有两个错误:
match=“/ID”
将只匹配文档最外层的ID元素,而
$ID
引用的是不存在的变量。