【问题标题】:Group dynamically generated nodeset分组动态生成的节点集
【发布时间】:2014-11-24 03:00:17
【问题描述】:

我在使用 XSLT 进行动态分组时遇到问题。

我的问题很复杂(我认为),部分原因是我尝试转换的节点集是从 apache xalan/sql 扩展动态生成的。我密切关注文档站点上的示例:see link

XSLT 项目很大;我只包含了以下要点:

<xsl:template match="/">
    <!-- I omitted the connection management code -->
    <xsl:variable name="result" select="sql:query($connection, $query)"/>
    <xsl:apply-templates select="$result/sql/row-set"/>
</xsl:template>

<xsl:template match="row">
    <xsl:apply-templates select="col"/>
</xsl:template>

<xsl:template match="col">
  <xsl:value-of select="text()"/>
</xsl:template>

$result 节点集具有以下结构:

<sql>
    <row-set>
        <row>
            <col column-label='Name'>Bob</col>
            <col column-label='Site'>Site1</col>
            <col column-label='Active'>Yes</col>
        </row>
        <row>
            <col column-label='Name'>Sally</col>
            <col column-label='Site'>Site2</col>
            <col column-label='Active'>Yes</col>
        </row>
        <row>
            <col column-label='Name'>Sam</col>
            <col column-label='Site'>Site1</col>
            <col column-label='Active'>No</col>
        </row>
        <row>
            <col column-label='Name'>Jeff</col>
            <col column-label='Site'>Site2</col>
            <col column-label='Active'>Yes</col>
        </row>
    </row-set>   
</sql>

想要的结果:

<sql>
    <row-set>
        <site>
            <site-name>Site1</site-name>
            <active>
                <name>Bob</name>                        
            </active>
            <in-active>
                <name>Sam</name>
            </in-active>
        </site>
        <site>
            <site-name>Site2</site-name>
            <active>
                <name>Sally</name>
                <name>Jeff</name>                        
            </active>
            <in-active/>
        </site>
    </row-set>   
</sql>

由于 ma​​tch 不允许使用变量,因此我很难尝试使用 la muenchian 的键进行分组:

<xsl:key name="group-site" match="$result/sql/row-set/" use=?>

【问题讨论】:

  • 听起来并不令人不快,但 XSL 是关于转换结构化 XML 文档的。从这个角度来看,您的 $result 节点集几乎没有提供任何有趣的结构可供构建。
  • 由于输入的 XML 似乎是一个直接的 SQL 数据库输出,我建议你至少 GROUP BY site,并在 XML 中反映这个结构元素。
  • @xbug -- 我同意 XSLT 可能不是正确工具的建议。不幸的是,这是一个我正在扩充的遗留项目。也就是说也有一个源 XML 文档,但我省略了它。源 XML 包含构造 sql $query 所需的节点。我上面显示的“所需结果”将与源文档集成以生成新的转换后的 XML。

标签: xslt dynamic node-set


【解决方案1】:

我在尝试使用 la muenchian 键进行分组时遇到了困难 因为匹配不允许变量:

您不需要在 match 定义中使用变量。将您的关键元素定义为:

<xsl:key name="row-by-site" match="row" use="col[@column-label='Site']"/>

调用 key() 函数时,您必须位于查询创建的“文档”的上下文中 - 否则它将在源 XML 文档中查找要匹配的行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 2021-09-29
    • 2012-06-02
    • 2017-10-21
    • 1970-01-01
    相关资源
    最近更新 更多