1

$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

4

1 回答 1

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

二、XSLT 2.0

使用 XPath 2.0replace()功能

<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
于 2013-03-25T14:32:32.727 回答