如何在XSLT中转义@字符

时间:2013-03-25 14:01:23

标签: xslt data-binding xslt-1.0

$ binding-path包含类似Contact!ShowsInterest的内容,应转换为Contact/@ShowsInterest

这是我到目前为止所尝试的:

<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 个答案:

答案 0 :(得分: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