2010-12-12 44 views
7

我想在xslt的select语句中使用动态变量名称。我们可以在xslt的select语句中使用动态变量名吗?

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:template match="/"> 
    <xsl:variable name="input" select="input/message" /> 
    <xsl:variable name="Name" select="'MyName'" /> 
    <xsl:variable name="Address" select="MyAddress" /> 
    <xsl:variable name="output" select="concat('$','$input')" /> <!-- This is not working --> 
    <output> 
     <xsl:value-of select="$output" /> 
    </output> 
</xsl:template> 

为变量 “输入” 可能的值是 '名称' 或 '地址'。 输出变量的select语句应该有一个基于输入变量值的动态变量名称。我不想使用xsl:choose。我想动态选择值。 请给我一个解决方案。

谢谢, dhinu

+0

问得好,+1。查看我的答案,获取完整而简短的解决方案。 :) – 2010-12-12 04:43:57

回答

11

XSLT 1.0和XSLT 2.0不具有动态的评价。

解决您的问题

这种转变

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:my="my:my"> 
<xsl:output method="text"/> 

<my:values> 
    <name>MyName</name> 
    <address>MyAdress</address> 
</my:values> 

<xsl:template match="/"> 
    <xsl:variable name="vSelector" 
    select="input/message"/> 
    <xsl:value-of select= 
    "document('')/*/my:values/*[name()=$vSelector]"/> 
</xsl:template> 
</xsl:stylesheet> 

当下面的XML文档应用:

<input> 
    <message>address</message> 
</input> 

产生想,正确的结果

MyAdress 

当同一变换这个XML文档施加:

<input> 
    <message>name</message> 
</input> 

再次通缉,正确的结果产生

MyName 

终于:如果你不希望使用document()函数,但会使用xxx:node-set()扩展函数,那么这个解决方案(看起来非常相似)就是你想要的,你可以在这里查询你的XSLT处理器文档以获得扩展名的确切名称空间:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:ext="http://exslt.org/common" > 
<xsl:output method="text"/> 

<xsl:variable name="vValues"> 
    <name>MyName</name> 
    <address>MyAdress</address> 
</xsl:variable> 

<xsl:template match="/"> 
    <xsl:variable name="vSelector" 
    select="input/message"/> 
    <xsl:value-of select= 
    "ext:node-set($vValues)/*[name()=$vSelector]"/> 
</xsl:template> 
</xsl:stylesheet> 
+0

谢谢!它为我工作..只是想知道是否有任何替代方式,而不使用额外的命名空间xmlns:my =“my:my”? – dhinu 2010-12-12 05:16:07

+0

@dhinu:很高兴我的回答很有用。通过接受答案(通过点击答案旁边的复选标记)来表达SO的感激之情:)。你可以把''放在另一个文件中,并用'document()'函数再次访问它。在XSLT 1.0中,你通常必须使用这种技术。如果元素位于''或''的主体中,则不能直接使用XPath访问它们,并且需要首先应用扩展函数('xxx:node-set()') 。在XSLT 2.0中,可以直接访问''或''中的元素。 – 2010-12-12 06:47:11

+0

您能否提供一个使用扩展函数(xxx:node-set())访问xsl:变量主体中元素的示例? (即时通讯使用XSLT 1.0) – dhinu 2010-12-12 09:50:39

0

除了@ Dimitre的很好的答案,对于这种特殊情况下(输出字符串值),你也可以使用:

<xsl:variable name="output" 
       select="concat(substring($Name, 1 div ($input = 'Name')), 
          substring($Address, 1 div ($input = 'Address')))"/> 
相关问题