XSLT:使用键和条件的“选择值”?

2023-12-24

这个问题是上一个线程的后续问题:XSLT:根据其他节点的值之和进行排序 https://stackoverflow.com/questions/13502321/xslt-sorting-based-on-sum-of-values-from-other-nodes

我现在可以使用键从其他节点汇总数据。 我似乎无法得到的是现在应用条件来选择使用这些键时所需要的数据所需的语法或方法。

这是我正在使用的简化 xml(对上一个进行了修改以突出显示问题):

<Horses>
    <Horse>
        <ID>1</ID>
        <Name>hrsA</Name>
        <SireID>101</SireID>
        <Age>3</Age>
        <Pace>
            <Stakes>20</Stakes>
            <Wins>0</Wins>
        </Pace>
    </Horse>
    <Horse>
        <ID>2</ID>
        <Name>hrsB</Name>
        <SireID>101</SireID>
        <Age>6</Age>
        <Pace>
            <Stakes>1600</Stakes>
            <Wins>9</Wins>
        </Pace>
    </Horse>
    <Horse>
        <ID>3</ID>
        <Name>hrsC</Name>
        <SireID>101</SireID>
        <Age>3</Age>
        <Trot>
            <Stakes>200</Stakes>
            <Wins>2</Wins>
        </Trot>
    </Horse>
    <Horse>
        <ID>4</ID>
        <Name>hrsD</Name>
        <SireID>101</SireID>
        <Age>4</Age>
        <Pace>
            <Stakes>50</Stakes>
            <Wins>0</Wins>
        </Pace>
        <Trot>
            <Stakes>100</Stakes>
            <Wins>1</Wins>
        </Trot>
    </Horse>
    <Horse>
        <ID>5</ID>
        <Name>hrsE</Name>
        <SireID>101</SireID>
        <Age>3</Age>
        <Pace>
            <Stakes>100</Stakes>
            <Wins>1</Wins>
        </Pace>
        <Trot>
            <Stakes>300</Stakes>
            <Wins>1</Wins>
        </Trot>
    </Horse>
</Horses>
<Sires>
    <Sire>
        <ID>101</ID>
        <Name>srA</Name>
        <LiveFoalsALL>117</LiveFoalsALL>
    </Sire>
</Sires>

在一种情况下,我需要获得属于某一年龄的父亲的后代(马)。

由于没有指定年龄,我使用一个密钥对赢得的赌注进行排序,如下所示(感谢 Dimitre):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:key name="kOffspring" match="Horse" use="SireID"/>

 <xsl:template match="/*">
  <xsl:apply-templates select="Sires/Sire">
   <xsl:sort select="sum(key('kOffspring', ID)/*/Stakes)"
             data-type="number" order="descending"/>
  </xsl:apply-templates>
 </xsl:template>

 <xsl:template match="Sire">
    <!-- get the data I want -->
 </xsl:template>
</xsl:stylesheet>

现在,在“获取我想要的数据”中,我尝试只获取 3 岁的马(年龄=3) 例如,为了只获得 srA 的 3 岁获胜后代(答案 = 2),我需要这样的东西,我在想:

<xsl:value-of select="count(key('kOffspring', ID)[Age=3]/*/Wins)"/>

但这不起作用...或者我是否需要为每个年龄创建一个新密钥,我想使用一些条件语法(?),例如:

<xsl:key name="kOffspring" match="Horse[/Age=3]" use="SireID"/>

正如你所看到的,我真的不知道我在做什么,也不知道这是否可能:-)

.

类似的另一种情况是需要计算有多少匹马是获胜者 - 答案=4(不是获胜次数,只是他们是否以配速或小跑获胜......第三种情况需要仅以配速或仅以小跑获胜)。

我在 Sire 模板中尝试了以下方法:

<xsl:value-of select="count(key('kOffspring', ID)/*/Wins &gt; 0)"/>

但这只返回计数为一。

如果这里有任何专家可以帮助我前进,我将不胜感激。我发现与其他编程语言相比,xslt 语法有点令人困惑且难以记住 - 我希望我能尽快掌握它,因为它非常强大。

问候, 布莱斯·斯坦伯格。


这种转变:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:key name="kOffspring" match="Horse" use="SireID"/>

 <xsl:template match="/*">
  <xsl:apply-templates select="Sires/Sire">
   <xsl:sort select="sum(key('kOffspring', ID)/*/Stakes)"
             data-type="number" order="descending"/>
  </xsl:apply-templates>
 </xsl:template>

 <xsl:template match="Sire">
     Sire <xsl:value-of select="concat(ID,' (', Name, ') Stakes: ')"/>
   <xsl:value-of select="sum(key('kOffspring', ID)/*/Stakes)"/>
     3 year old winning offspring: <xsl:value-of
     select="count(key('kOffspring', ID)[Age = 3 and */Wins > 0])"/>
     Offspring that ever were a winner: <xsl:value-of
      select="count(key('kOffspring', ID)[*/Wins > 0])"/>
 </xsl:template>
</xsl:stylesheet>

当应用于提供的 XML 时(所提供的片段,包含在单个顶部元素中以使其成为格式良好的 XML 文档):

<t>
    <Horses>
        <Horse>
            <ID>1</ID>
            <Name>hrsA</Name>
            <SireID>101</SireID>
            <Age>3</Age>
            <Pace>
                <Stakes>20</Stakes>
                <Wins>0</Wins>
            </Pace>
        </Horse>
        <Horse>
            <ID>2</ID>
            <Name>hrsB</Name>
            <SireID>101</SireID>
            <Age>6</Age>
            <Pace>
                <Stakes>1600</Stakes>
                <Wins>9</Wins>
            </Pace>
        </Horse>
        <Horse>
            <ID>3</ID>
            <Name>hrsC</Name>
            <SireID>101</SireID>
            <Age>3</Age>
            <Trot>
                <Stakes>200</Stakes>
                <Wins>2</Wins>
            </Trot>
        </Horse>
        <Horse>
            <ID>4</ID>
            <Name>hrsD</Name>
            <SireID>101</SireID>
            <Age>4</Age>
            <Pace>
                <Stakes>50</Stakes>
                <Wins>0</Wins>
            </Pace>
            <Trot>
                <Stakes>100</Stakes>
                <Wins>1</Wins>
            </Trot>
        </Horse>
        <Horse>
            <ID>5</ID>
            <Name>hrsE</Name>
            <SireID>101</SireID>
            <Age>3</Age>
            <Pace>
                <Stakes>100</Stakes>
                <Wins>1</Wins>
            </Pace>
            <Trot>
                <Stakes>300</Stakes>
                <Wins>1</Wins>
            </Trot>
        </Horse>
    </Horses>
    <Sires>
        <Sire>
            <ID>101</ID>
            <Name>srA</Name>
            <LiveFoalsALL>117</LiveFoalsALL>
        </Sire>
    </Sires>
</t>

产生想要的正确结果:

 Sire 101 (srA) Stakes: 2370
 3 year old winning offspring: 2
 Offspring that ever were a winner: 4

或者,一个可能更有效的解决方案是使用另一个复合密钥,它的两个部分是SireIDAge:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:key name="kOffspring" match="Horse" use="SireID"/>
 <xsl:key name="kOffspringBySireIdAndAge" match="Horse"
  use="concat(SireID, '+', Age)"/>

 <xsl:template match="/*">
  <xsl:apply-templates select="Sires/Sire">
   <xsl:sort select="sum(key('kOffspring', ID)/*/Stakes)"
             data-type="number" order="descending"/>
  </xsl:apply-templates>
 </xsl:template>

 <xsl:template match="Sire">
     Sire <xsl:value-of select="concat(ID,' (', Name, ') Stakes: ')"/>
   <xsl:value-of select="sum(key('kOffspring', ID)/*/Stakes)"/>
     3 year old winning offspring: <xsl:value-of
     select="count(key('kOffspringBySireIdAndAge', concat(ID, '+3'))
                       [*/Wins > 0]
                  )"/>
     Offspring that ever were a winner: <xsl:value-of
      select="count(key('kOffspring', ID)[*/Wins > 0])"/>
 </xsl:template>
</xsl:stylesheet>

当此转换应用于同一个 XML 文档(如上)时,会产生相同的正确结果:

 Sire 101 (srA) Stakes: 2370
 3 year old winning offspring: 2
 Offspring that ever were a winner: 4
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

XSLT:使用键和条件的“选择值”? 的相关文章

随机推荐

  • 如何在加特林的Json Body中添加随机值?

    我需要每次创建一个随机正整数并将其发送到加特林中的 Json 主体 我使用下面的代码创建一个随机正整数 val r new scala util Random val OrderRef r nextInt Integer MAX VALUE
  • 为什么在套索回归中计算 MSE 会给出不同的输出?

    我正在尝试对 lasso2 包中的前列腺癌数据运行不同的回归模型 当我使用 Lasso 时 我看到两种不同的方法来计算均方误差 但它们确实给了我完全不同的结果 所以我想知道我是否做错了什么 或者这是否仅仅意味着一种方法比另一种方法更好 Ne
  • 启用 httpd-vhosts.conf 后 WAMP 服务器未运行

    我尝试在 WAMP 安装上启用虚拟主机 但如果启用 http vhosts conf WAMP 服务器将不会运行 并且图标保持橙色 这是我的主机文件 127 0 0 1 localhost 127 0 0 1 test localhost
  • 关系方法必须从 Laravel 4 中未查看的模型调用返回 Illuminate\Database\Eloquent\Relations\Relation 类型的对象

    我有一个模型Ability 它属于另一个模型AbilityType
  • iOS 开发者企业计划会员资格到期前续订

    我收到了苹果公司发来的关于企业会员计划续订的电子邮件 以下是我的相关问题 计划到期前续订对分发证书有影响吗 如果在到期前续订程序 使用分发证书签名的应用程序是否可以继续运行而不会出现任何问题 续订后到期前是否需要再次分发企业应用程序 感谢您
  • 从命令行对不同长度的十六进制数进行排序?

    如果我有一个不同长度的十六进制数文件 例如 1F b c 如何从命令行对它们进行排序 欢迎使用 Linux 解决方案 尽管我将使用 Windows 和 cygwin 或 gnuwin32 注意 我显然不能使用 SORT 因为这会使它们保持错
  • 在Windows中,有没有办法将errno转换为HRESULT?

    我知道HRESULT FROM WIN32宏将 Win32 错误代码转换为 HRESULT 有什么方法可以从errno error 简而言之 不 As of http msdn microsoft com en us library 581
  • Raphael:通过简单的无限动画逐渐减慢动画速度

    这个问题在本质上与两年前提出的另一个问题类似 为什么 Raphael 的帧速率在这段代码上变慢了 https stackoverflow com questions 2733613 why does raphaels framerate s
  • MySQL - 查询所有没有预约的用户

    如果我有两个表 用户和约会 我将如何查询数据库以找到类似以下内容的内容 SELECT FROM users WHERE none of appointments user user id 我假设我需要某种类型的约会表连接 只是不知道从哪里开
  • Apache 缓存 javascript 资源?

    不久前我在使用 javascript 资源时遇到了麻烦 当我对它们进行更改时 它们不会生效 文件将变成无效的 javascript 萤火虫抛出错误和警告 我注意到我的更改没有出现 并且特殊字符被添加到文件末尾 再进一步挖掘 我注意到特殊字符
  • JavaScript 圆角透明背景

    我正在寻找一个可以在上面创建圆角的 JavaScript 库div具有透明背景的标签 使得父元素的背景颜色 图像在圆角处可见 以圆角为例without透明背景 看看左边的菜单这一页 http chaletsdesbouleaux com 请
  • Angular UI-Router 将根 url 发送到 404

    我有一个令人恼火的问题ui router 一切都按我想要的方式进行 所有错误的 URL 都会发送到404状态 但是 即使当 url 为时我的默认状态正确呈现 网址为 被重定向到 404 我怎样才能提供服务default向双方声明 and a
  • 更改 jquerymobile 上的自定义导航栏图标

    尚未找到更改具有多个页脚的页面上的自定义导航栏图标的解决方案 这就是我目前正在使用的 live menu ui icon css background url btn on gif important live menu ui icon c
  • 尝试在 for 循环中将元素添加到 xml 文件时出现 HIERARCHY_REQUEST_ERR

    正如标题所示 我尝试使用 for 循环将元素添加到 xml 文档中 我有一个ArrayList称为的字符串names我希望迭代 并为每个名称创建一个
  • 尝试打开 Pandas 时历史记录保存线程错误

    我刚刚在工作的远程桌面上安装了 IPython 我必须在桌面上创建一个快捷方式来连接到 IPython 因为远程桌面无法访问互联网 我能够成功打开 IPython 笔记本 但是 当我尝试导入 pandas 时 import pandas a
  • 如何测量执行的汇编指令的数量?

    我想以某种方式从二进制文件中获取 已执行的汇编程序指令的数量 考虑下面的代码 if password 0 p if password 1 a printf Correct Password n 那么如果我用例如启动程序 abc 它不会采用第
  • 迭代器不属于其分配的文本缓冲区

    这是一个简单的骨头save as 功能 gint save as GtkWidget parent struct buffers B GtkWidget file chooser gtk file chooser dialog new Sa
  • Javascript 模块模式、原型和 Google Closure

    我无法让此代码结构在 Google Closure 编译器的混淆中幸存下来 这是一些示例代码 var MyModule function function myModule Constructor function moduleFoo ur
  • 消除二值图像中的字符倾斜

    我正在研究车牌识别 问题是我必须消除二值图像中的字符倾斜 以提高模板匹配的准确性 我已经做了很多预处理来删除图像中不必要的像素 并且我可以将字符分割出来 但不幸的是 它们是倾斜的 从 转换为灰度到二进制 然后 预处理技术 分割后 从最后一张
  • XSLT:使用键和条件的“选择值”?

    这个问题是上一个线程的后续问题 XSLT 根据其他节点的值之和进行排序 https stackoverflow com questions 13502321 xslt sorting based on sum of values from