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:使用键和条件的“选择值”? 的相关文章

  • Access 2007 不会从 XML 文件导入所有元素数据

    我需要将此 XML 数据导入 Access 中以进行进一步处理 我在这里只复制了一小部分数据
  • 来自 Java 的 Apache FOP 与 XSLT 2.0...?

    我在 Apache FOP 1 0 的嵌入式使用中使用 XSLT 2 0 的某些功能时遇到问题 特别是在使用 current group 时出现异常 我看到 FOP 正在使用 xalan 2 6 它引发了异常 我尝试排除 xalan 2 6
  • XPath 匹配空格分隔的属性值?

    我有一个 XML
  • 使用 lxml 和 xpath 解析 xml 文件时如何保留 &

    我试图从输入 xml 文件中提取一些信息 并使用 lxml 和 xpath 指令将其打印到输出文件中 我在读取如下所示的 xml 标签时遇到问题
  • xslt 1.0 如何在选择条件中用 0(零)替换空或空白值

  • Xpath 不适用于 Selenium

    我正在尝试为旧系统构建测试 HTML 的格式不正确 我需要识别并单击单选按钮 html 看起来像这样 td class tablerow td
  • 如何在 C# 中启用 XSLT 脚本..?

    找到答案后我修改了问题的标题 P 我正在通过 C 程序加载 XML 文件和 XSL 文件并触发 XSL 转换 以下是其代码 static void Main string args Create the XslCompiledTransfo
  • 通过 XSL 查看 XML 到 XHTML 转换中的源代码

    我正在尝试使用 XSL 文件将 XML 文件转换为 XHTML 文件 如何查看转换后输出的XHTML源代码 我目前正在通过 Firefox 查看结果 但我看到的只是 XHTML 文件的渲染版本 我想查看源代码 但是当我转到 查看 gt 页面
  • 如何以最短的等待时间加速 Java Selenium 脚本

    我目前正在开发一个 java selenium 项目 这通常是一个小脚本 我必须在其中检查每个元素是否存在 并基于触发一些操作 但我们主要关心的是完成脚本的持续时间 基本上 我在脚本中使用了下面的每一个并运行了测试 尽管在每种情况下脚本都在
  • XSLT 将平面树结构转换为列表

    我有一个描述eshop树结构的xml文件 我只需要获取所有子组的列表 我不知道结构中有多少个父 子级别 输入 xml 如下所示
  • 使用 XPATH(和 PHP)从样式属性中选择背景 url

    我只想从此背景图像样式属性中选择 url 这可以通过 XPATH 实现吗 a href http www test com style background image none test a 我有类似的东西 url xpath gt qu
  • 加载外部 XSLT 时发生异常

    我有大量来自第三方的 XSLT 我需要用它来转换一些数据 如果我使用 xsltproc 它工作正常并按预期输出数据 我有以下 C 代码来尝试在进程中使用它 sXML 是 XML 的集合 oJob ContentTemplate 是 XSLT
  • 在 System.Xml.XPath 中启用 XPath2 查询(XPathException:无效令牌)

    Microsoft 的 System Xml XPath nuget package 可用于 NET 4 6 声称支持 XPath 1 0 和 2 0 德文档 https msdn microsoft com en us library s
  • (Kiss)XML xpath 和默认命名空间

    我正在开发一个 iPhone 项目 需要解析一些 xml xml 可能包含也可能不包含默认名称空间 我需要知道如何解析 xml 以防它使用默认命名空间 由于我需要读取和写入 xml 因此我倾向于使用 KissXML 但我愿意接受建议 这是我
  • XSLT:如何在“匹配”属性中表示 OR?

    我想对与名称 A 或 B 匹配的元素执行一系列操作 我在想下面类似的事情 但它不起作用
  • XSLT 将动态 XML 转换为 CSV 并且 XML 节点不完全重复 II

    我正在尝试创建 XSLT 将 XML 转换为 CSV 这里放置了我的 XML 和预期输出 任何人都知道如何获得以下输出 请优先分享我 我的 XML 是
  • 随机推荐

    • 如何在加特林的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