代码之家  ›  专栏  ›  技术社区  ›  Jason Suárez

动态模式

  •  0
  • Jason Suárez  · 技术社区  · 16 年前

    如果我有一个文件

    <mydocroot>
    <request>
       <key>Ham</key>
    </request>
    <node>
       <data alias='Ham' id='27'>Some value</data>
       <data alias='Eggs' id='14'>Greenish</data>
       <data alias='Condiment' id='32'>Salt and pepper</data>
       ...
    </node>
    </mydocroot>
    

    <xsl:template match="/">
        <xsl:value-of select="/mydocroot/node/data[@alias=string(/mydocroot/request/key)]" />
    </xsl:template>
    

    <xsl:template match="/">
        <xsl:value-of select="/mydocroot/node/data[@alias='Ham']" />
    </xsl:template>
    

    按预期打印“某些值”。

    我做错了什么?

    谢谢

    实际上,我并不是100%肯定我正在处理的底层文档是什么样子的,但我知道,继续这个例子,

    <xsl:value-of select="/mydocroot/request/key" /> <!-- prints "Ham" -->
    

    作品

    我应该能够将属性值与节点值匹配吗?

    3 回复  |  直到 16 年前
        1
  •  0
  •   Thiyagaraj    16 年前

    如果使用“/”启动XPath表达式,则表示从文档的根节点开始,但根元素是“mydocroot”,因此需要将其包含在XPath中。

    <xsl:value-of select="/mydocroot/node/data[@alias=string(/mydocroot/request/key)]" />
    
        2
  •  0
  •   Jason Suárez    16 年前

    因此,我做了以下工作,但似乎有点粗俗:

    <xsl:template match="/">
        <xsl:variable name="aliasval"><xsl:value-of select="string(/mydocroot/request/key)" /></xslvariable>
        <xsl:value-of select="/myrootdoc/node/data[@alias=$aliasval]" />
    </xsl:template>
    

        3
  •  0
  •   Tomalak    16 年前

    “我应该能够将属性值与节点值匹配吗?”

    string() 明确地这对我有用(对你也应该有用):

    <xsl:value-of select="/mydocroot/node/data[@alias = /mydocroot/request/key]" />
    <!-- prints "Some value" -->
    

    更好,因为更明确( /mydocroot/request/key 无法选择多个节点!):

    <xsl:value-of select="/mydocroot/node/data[@alias = /mydocroot/request/key[1]]" />
    

    在这些变化中,一个 <xsl:key> 也会派上用场:

    <xsl:key name="kDataByAlias" match="node/data" use="@alias" />
    
    <!-- later... -->
    
    <xsl:value-of select="key('kDataByAlias', /mydocroot/request/key[1])" />