身份转换XSLT

时间:2016-09-30 16:10:57

标签: xslt

我有一个传入的XML文档。我只需要在下面的传入XML文档中修改一个元素示例<ID>元素的值。我基本上需要检查名为<ID>的元素,如果该值没有任何连字符,它将采用连字符( - )然后我需要取连字符前的值( - )ex- 4314141 传入的XML文档:

<Message>
  <ID>4314141-324234</ID>
  <EMAIL>abc</EMAIL>
</Message>

我在XSL下面使用这个来做这个但是它没有按预期工作。 XSL:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:dp="http://www.datapower.com/extensions" 
 xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
 extension-element-prefixes="dp" 
 exclude-result-prefixes="dp"  >
  <xsl:variable name="uuid" select="dp:variable('var://context/txn/uuid')" />
 <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
<xsl:template match="/ID">
    <xsl:copy>

            <ID><xsl:value-of select="substring-before($ID, ' -')" /></ID>

        <xsl:apply-templates/>
    </xsl:copy>
</xsl:template>
<xsl:template match="ID"/>
</xsl:stylesheet>

让我知道如何做到这一点。

2 个答案:

答案 0 :(得分:1)

  

没有任何连字符,它将采取

这将执行您的身份复制模板。

  

如果值包含连字符( - ),那么我需要取连字符前的值( - )

<xsl:template match="ID[contains(., '-')]">
    <xsl:copy>
        <xsl:value-of select="substring-before(., '-')" />
    </xsl:copy>
</xsl:template>

友情提示:请注意匹配模式中的/

答案 1 :(得分:0)

只需使用此模板覆盖身份规则:

  <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>

应用于提供的XML文档

<Message>
    <ID>4314141-324234</ID>
    <EMAIL>abc</EMAIL>
</Message>

产生了想要的正确结果

<Message>
   <ID>4314141</ID>
   <EMAIL>abc</EMAIL>
</Message>