2016-09-30 69 views
1

我有一個傳入的XML文檔。我只需要在下面的傳入XML文檔中修改一個元素示例<ID>元素的值。我基本上需要檢查名爲<ID>的元素,如果該值沒有任何連字符,它將採取原樣並且如果該值包含連字符( - ),則需要在連字符( - )之前取值 - 4314141 傳入XML文檔:身份轉換XSLT

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

讓我知道我可以做到這一點。

+0

兩個錯誤:'匹配= 「/ ID」'將只能以文件的最外面的級別相匹配的ID元件,和' $ ID'指的是一個不存在的變量。 –

回答

1

沒有任何連字符將採取,因爲它是

這將做您的身份複製的模板。

如果值包含連字符( - ),那麼我需要連字符之前採取的值( - )

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

友好的建議:請小心使用你的匹配模式/

+0

嗨感謝您的快速響應,解決方案無法按預期工作。我只在輸出XML中獲得< EMAIL>標籤的價值。可以請檢查一次並讓我知道。 – user5458829

+1

@ user5458829 - 請參閱http://xsltransform.net/6rewNxU。 (請注意,沒有''就像您在原始樣式表中那樣)。如果您的XML輸入不同(包含默認名稱空間),請更新您的問題。 –

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>