2013-03-25 241 views
1

$綁定路徑中包含類似Contact!ShowsInterest應轉換爲Contact/@ShowsInterest如何逃脫@字符XSLT

這是我試過到目前爲止:

<xsl:variable name="bindpath" select="translate($binding-path, '!','/&#x40;')" /> 
       <xsl:value-of select="concat('{Binding XPath=',$bindpath,'}')"/> 

<xsl:variable name="bindpath" select="translate($binding-path, '!','/@')" /> 
       <xsl:value-of select="concat('{Binding XPath=',$bindpath,'}')"/> 

但是無論我嘗試什麼,結果總是是Contact/ShowsInterest

+1

'translate'只做一換一替換,您不能用兩個字符的字符串替換單個字符。你必須提取'substring-before'和'substring-after'這個!並在它們之間插入'/ @'。 – 2013-03-25 14:33:58

回答

3

translate()函數只能用單個字符(或沒有任何內容,因此將其刪除)替換每個字符的每個出現次數。

使用

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:variable name="binding-path" select="'Contact!ShowsInterest'"/> 

<xsl:template match="/"> 
    <xsl:variable name="bindingpath"> 
    <xsl:value-of select="substring-before($binding-path, '!')"/> 
    <xsl:text>/@</xsl:text> 
    <xsl:value-of select="substring-after($binding-path, '!')"/> 
    </xsl:variable> 

    <xsl:value-of select="$bindingpath"/> 
</xsl:template> 
</xsl:stylesheet> 

當這種轉換應用於任何XML文檔(未使用),想要的,正確的結果產生

Contact/@ShowsInterest 

II。 XSLT 2.0

使用XPath 2.0 replace()功能

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:variable name="binding-path" select="'Contact!ShowsInterest'"/> 

<xsl:template match="/"> 
    <xsl:variable name="bindingpath" select="replace($binding-path, '!', '/@')"/> 

    <xsl:value-of select="$bindingpath"/> 
</xsl:template> 
</xsl:stylesheet> 

這種轉變產生相同的正確結果:

Contact/@ShowsInterest