使用 XSL:Key 查找特定的后代节点

发布于 2024-09-03 09:28:43 字数 982 浏览 1 评论 0原文

给出以下代码:

<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”列,以便我可以在转换中编写特定的代码。

我已经获得了一个通用密钥,可以测试任何表是否具有按名称指定的列,但尚未弄清楚如何使其特定于转换当前正在使用的表。

    <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>

所以我最终得到所有表格的“true”。任何指导将不胜感激。

Given the following code:

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

I want to be able to test using an xsl:key if specific table has a specific column by name. For instance, I want to know if a table has a 'created_at' column so I can write specific code within the transformation.

I've gotten a general key that will test if any table has a given column by name, but have not figured out how to make it specific to the table the transformation is currently working with.

    <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>

So I end up with 'true' for all the tables. Any guidance would be appreciated.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

高跟鞋的旋律 2024-09-10 09:28:43

以下转换显示了如何完成此操作

<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>
</xsl:text>

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

当将此转换应用于提供的 XML 文档时,将生成所需的正确结果

true
false

The following transformation shows how this can be done:

<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>
</xsl:text>

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

When this transformation is applied on the provided XML document, the wanted, correct result is produced:

true
false
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文