gpt4 book ai didi

xml - 与 xpath 谓词匹配的 xsl 键

转载 作者:行者123 更新时间:2023-12-03 16:16:19 25 4
gpt4 key购买 nike

我正在学习 XML/XSLT/XPATH 并且有一些以特定方式工作的东西,但希望通过删除重复代码来提高效率。

XML 示例

<student>
<scores>
<score scoreID="1" weight="10" mandatory="false">7</score>
<score scoreID="2" weight="10" mandatory="false">9</score>
<score scoreID="3" weight="30" mandatory="true">13</score>
</scores>
</student>

<student>
<scores>
<score scoreID="1" weight="10" mandatory="false">8</score>
<score scoreID="2" weight="10" mandatory="false">4</score>
<score scoreID="3" weight="30" mandatory="true">25</score>
</scores>
</student>

所以基本上我有一些 XSL 可以检查
  • 如果分数总和大于 25(即总权重的一半)
  • 如果强制元素为真,则将分数除以权重。
  • 如果结果大于 0.5;打印相应的结果

  • 这是用下面的表达式完成的

    XSL
    <xsl:when test="sum(scores/score) &gt; 25 and scores/score[@mandatory='True' and .div @weight &lt; 0.5]">

    这一切都很好,除了我有很多学生和很多分数而且效率不高,因为我在每个分数下写了权重和强制性值。

    我想做的是声明另一个具有权重和强制属性的结构,然后使用键将它们引用到每个分数。

    所以相反,我的 XML 更喜欢这样(每个分数下基本上没有权重和强制属性)
    <quizDetails>
    <quiz quizID="1" weight="10" mandatory="false" />
    <quiz quizID="2" weight="10" mandatory="false" />
    <quiz quizID="3" weight="30" mandatory="true" />
    </quizDetails>

    <student>
    <scores>
    <score scoreID="1">7</score>
    <score scoreID="2">9</score>
    <score scoreID="3">13</score>
    </scores>
    </student>

    <student>
    <scores>
    <score scoreID="1">8</score>
    <score scoreID="2">4</score>
    <score scoreID="3">25</score>
    </scores>
    </student>

    接下来是我这样做的尝试

    定义键
    <xsl:key name ="quizKey" match="quizDetails" use="@quizID" />
    <xsl:key name ="weightKey" match="quizDetails" use="@weight" />
    <xsl:key name ="mandatoryKey" match="quizDetails" use="@mandatory" />
    <xsl:key name ="scoreKey" match="scores" use="@scoreID" />

    条件测试
    <xsl:when test="sum(scores/score) &gt; 25 and (key('quizKey', '@quizID') = key('scoreKey', '@scoreID')) and (key('mandatoryKey', 'true') .div (key('weightKey', '@weight') &lt0.5;">

    条件测试有点偏离
  • 我尝试删除属性
  • 周围的单引号。
  • 我尝试过像 scoreKey = quizKey
  • 这样的比较
  • 我尝试通过一次添加一个条件来简化条件表达式
  • 我已经阅读并重新阅读了 W3C XSLT2.0 引用中关于 xsl:key 的部分

  • 使用按键功能基本上是我的主要问题。我想复制我以前的 xml 和 xsl 的行为,但没有重复代码。

    最佳答案

    我认为您在这里只需要一个键即可查找 quiz元素

    <xsl:key name="quizKey" match="quiz" use="@quizID" />

    查找 quiz当前分数元素的元素,键的使用是这样的
    key('quizKey', @scoreID)

    这意味着您的表达式需要如下所示:
    <xsl:when test="sum(scores/score) &gt; 25 
    and scores/score[number(.) div key('quizKey', @scoreID)[@mandatory='true']/@weight &lt; 0.5]">

    不过,您实际上可以通过仅在键中选择强制性测验元素来稍微改进一些事情。例如
    <xsl:key name="mandatoryKey" match="quiz[@mandatory='true']" use="@quizID" />

    那么条件变成如下:
    <xsl:when test="sum(scores/score) &gt; 25 
    and scores/score[number(.) div key('mandatoryKey', @scoreID)/@weight &lt; 0.5]">

    关于xml - 与 xpath 谓词匹配的 xsl 键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36215583/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com