如何使用XSLT将节点集置于属性值中?

时间:2010-11-16 16:52:56

标签: xslt

我有一个xsl模板,我想调用它来放入HTML节点属性:

<xsl:variable name="onClickJavaScript">
  <xsl:call-template name="GetOnClickJavaScript" />
</xsl:variable>
<a id="123">
  <xsl:attribute name="onclick">
    <xsl:value-of select="$onClickJavaScript" />
  </xsl:attribute>
</a>

我的问题是call-template返回一个节点集,属性值想成为一个字符串。我似乎找不到任何方法将节点集转换为有效的字符串。

我尝试将行值更改为:

<xsl:value-of select="$onClickJavaScript/text()" />

但它抱怨它需要返回一个节点集而不是(这是我希望的,没有抱怨的部分)。

在Visual Studio调试器中,我可以看到$ onClickJavaScript是一个具有单个维度和项目的NodeSet。我的字符串埋在那里,但无法访问: - (。

... UPDATE

当我调用我的模板时,它会通过一个大的case语句并调用另一个模板。这个其他模板有一个<xsl:choose>,在这种情况下它会跟随以下路径:

<xsl:when test="$isPrimary='true'">         
  <!-- Just provide the onclick event JavaScript -->
  <xsl:value-of select='concat($launchMethod, "(this, &apos;", $id, "&apos;, &apos;", $nodeid, "&apos;, &apos;", $instanceid, "&apos;)")' />
</xsl:when>

3 个答案:

答案 0 :(得分:2)

根据提供的信息,您的第一个样本应该有效,即

<xsl:attribute name="onclick">
  <xsl:value-of select="$onClickJavaScript" />
</xsl:attribute>

应插入onclick属性,其中(字符串)值为$onClickJavaScript

您甚至可以使用attribute value template

来简化您的XSLT
<a id="123" onclick="{$onClickJavaScript}">...</a>

或者去除变量并在属性节点内调用模板:

<xsl:attribute name="onclick">
  <xsl:call-template name="GetOnClickJavaScript" />
</xsl:attribute>

答案 1 :(得分:1)

  

我的问题是呼叫模板   返回节点集和属性   value想成为一个字符串。我不能   似乎找到了改变的方法   节点设置为有效的字符串。

问题在于您未展示的代码

事实上,我根本无法重现这个问题。

此转化

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

 <xsl:template match="/">
    <xsl:variable name="onClickJavaScript">
      <xsl:call-template name="GetOnClickJavaScript" />
    </xsl:variable>

   <xsl:variable name="onClickJavaScript2">
      <xsl:call-template name="GetOnClickJavaScript2" />
    </xsl:variable>

    <a id="123">
      <xsl:attribute name="onclick">
        <xsl:value-of select="$onClickJavaScript" />
      </xsl:attribute>
    </a>
    <a id="123456">
      <xsl:attribute name="onclick">
        <xsl:value-of select="$onClickJavaScript" />
      </xsl:attribute>
    </a>
 </xsl:template>

 <xsl:template name="GetOnClickJavaScript">Hello</xsl:template>

 <xsl:template name="GetOnClickJavaScript2">
  <a>Hello</a>
 </xsl:template>
</xsl:stylesheet>

应用于任何XML文档(未使用)时会产生没有任何错误的输出

<a id="123" onclick="Hello"/>
<a id="123456" onclick="Hello"/>

答案 2 :(得分:1)

我也无法重现这一点......这就是我尝试过的,on上点击a获取“foo(this,'3','test')”。还有什么不同?您尝试调用xsl:value-of on?

的结果树片段是什么
<xsl:template match="/">
  <xsl:variable name="onclick-val">
    <xsl:call-template name="foo" />
  </xsl:variable>
  <a>
    <xsl:attribute name="onclick">
      <xsl:value-of select="$onclick-val" />
    </xsl:attribute>
  </a>
</xsl:template>

<xsl:template name="foo">
  <xsl:choose>
    <xsl:when test="false()">
      false
    </xsl:when>
    <xsl:otherwise>
      <xsl:call-template name="callme" />
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

<xsl:template name="callme">
  <xsl:choose>
    <xsl:when test="true()">
      <xsl:value-of select='concat("foo", "(this, &apos;", "3", "&apos;, &apos;", "test", "&apos;)")' />
    </xsl:when>
    <xsl:otherwise>
      false
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>