【问题标题】:Finding Specific Descendant Nodes With XSL:Key使用 XSL:Key 查找特定的后代节点
【发布时间】:2010-05-27 18:30:57
【问题描述】:

给定以下代码:

<database>
    <table name="table1">
       <column name="id"/>
       <column name="created_at"/>
    </table>
    <table name="table2">
       <column name="id"/>
       <column name="updated_at"/>
    </table>
</database>

如果特定表的名称有特定列,我希望能够使用 xsl:key 进行测试。例如,我想知道一个表是否有一个“created_at”列,这样我就可以在转换中编写特定的代码。

我得到了一个通用键,可以测试 any 表是否具有按名称给定的列,但还没有弄清楚如何使其特定于转换当前正在使用的表。

    <xsl:key name="columnTest" match="column" use="@name"/>
 <xsl:for-each select="database/table">   
    <xsl:choose>
       <xsl:when test="key('columnTest', 'created_at')">
          <xsl:text>true</xsl:text>
       </xsl:when>
       <xsl:otherwise>
          <xsl:text>false</xsl:text>
       </xsl:otherwise>
    </xsl:choose>
</xsl:for-each>

所以我最终为所有表格都设置了“真”。任何指导将不胜感激。

【问题讨论】:

  • 好问题 (+1)。请参阅我的答案以获得完整的解决方案。

标签: xslt xslkey


【解决方案1】:

以下转换显示了如何做到这一点:

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

 <xsl:output method="text"/>

 <xsl:key name="kTableByName"
  match="table" use="@name"/>

 <xsl:key name="kColumnByTable"
  match="column" use="concat(generate-id(..), '+', @name)"/>

 <xsl:template match="/">
  <xsl:value-of select=
   "boolean(key('kColumnByTable',
                 concat(generate-id(key('kTableByName', 'table1')),
                        '+',
                        'created_at'
                       )
               )
            )
   "/>

  <xsl:text>&#xA;</xsl:text>

  <xsl:value-of select=
   "boolean(key('kColumnByTable',
                 concat(generate-id(key('kTableByName', 'table1')),
                        '+',
                        'updated_at'
                       )
               )
            )
   "/>
 </xsl:template>
</xsl:stylesheet>

当对提供的 XML 文档应用此转换时,会产生所需的正确结果:

true
false

【讨论】:

  • 感谢 Dimitre,您对 xsl 的见解再次帮助了我 =)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 2018-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多