gpt4 book ai didi

xml - 如何根据子元素中的新计数值对元素进行排序。 XSLT 1.0

转载 作者:数据小太阳 更新时间:2023-10-29 02:27:44 25 4
gpt4 key购买 nike

我有一个这样的 xml 表:

<houses>
<house number="1">
<mainroom>
<roomprice>5</roomprice>
<roomtax>2</roomtax>
</mainroom>
<roompricefull>
<price value="8"/>
</roompricefull>
</house>
<house number="2">
<mainroom>
<roomprice>3</roomprice>
<roomtax>1</roomtax>
</mainroom>
<roompricefull>
<price value="7"/>
</roompricefull>
</house>
<house number="3">
<mainroom>
<roomprice>9</roomprice>
<roomtax>1</roomtax>
</mainroom>
<roompricefull>
<price value="4"/>
</roompricefull>
</house>
<house number="4">
<mainroom>
<roomprice>12</roomprice>
<roomtax>3</roomtax>
</mainroom>
<roompricefull>
<price value="6"/>
</roompricefull>
</house>
</houses>

所以我必须用“roomprice”值和“roomtax”的总和来更改每个“house”中“price”元素中属性“value”的值

我写了一个这样的xsl转换:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template name="PriceChange" match="price[parent::roompricefull]">
<xsl:copy>
<xsl:variable name="sn" select="../../@number"/>
<xsl:variable name="TaxValue" select="number(//house[@number=string($sn)]/mainroom/roomtax)"/>
<xsl:variable name="BaseValue" select="number(//house[@number=string($sn)]/mainroom/roomprice)"/>
<xsl:attribute name="value">
<xsl:value-of select="string($TaxValue+$BaseValue)"/>
</xsl:attribute>
<!--xsl:for-each select="/houses/house">
<xsl:sort select="houses/house[$sn]/roompricefull/@value"/>
</xsl:for-each-->
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

但是当我开始根据我的新值对“房子”元素进行排序时,我发现了问题。我实际上不明白为什么它不起作用,所以我在 up 代码中评论了几十个示例中的最后一个。

我明白了:

<houses>
<house number="1">
<mainroom>
<roomprice>5</roomprice>
<roomtax>2</roomtax>
</mainroom>
<roompricefull>
<price value="7"/>
</roompricefull>
</house>
<house number="2">
<mainroom>
<roomprice>3</roomprice>
<roomtax>1</roomtax>
</mainroom>
<roompricefull>
<price value="4"/>
</roompricefull>
</house>
<house number="3">
<mainroom>
<roomprice>9</roomprice>
<roomtax>1</roomtax>
</mainroom>
<roompricefull>
<price value="10"/>
</roompricefull>
</house>
<house number="4">
<mainroom>
<roomprice>12</roomprice>
<roomtax>3</roomtax>
</mainroom>
<roompricefull>
<price value="15"/>
</roompricefull>
</house>
</houses>

但预期的结果是:

<houses>
<house number="4">
<mainroom>
<roomprice>12</roomprice>
<roomtax>3</roomtax>
</mainroom>
<roompricefull>
<price value="15"/>
</roompricefull>
</house>
<house number="3">
<mainroom>
<roomprice>9</roomprice>
<roomtax>1</roomtax>
</mainroom>
<roompricefull>
<price value="10"/>
</roompricefull>
</house>
<house number="1">
<mainroom>
<roomprice>5</roomprice>
<roomtax>2</roomtax>
</mainroom>
<roompricefull>
<price value="7"/>
</roompricefull>
</house>
<house number="2">
<mainroom>
<roomprice>3</roomprice>
<roomtax>1</roomtax>
</mainroom>
<roompricefull>
<price value="4"/>
</roompricefull>
</house>
</houses>

如果您能帮助我整理并解释为什么我的示例不起作用,那就太好了。似乎我不明白 的含义,但我发现的一切都告诉我它的用法而没有任何解释。提前谢谢你。

最佳答案

it would be great if you could help me with sorting

这是正确的 XSLT 1.0 方法。

注意 xsl:sort 的正确使用需要:

  • 要指定的数据类型,默认为string,而我们这里需要number
  • xsl:apply-templates 中排序的最佳使用
  • 对输入文档的排序键按需组合(sum)进行排序的应用。
  • 排序顺序也被指定为默认的升序

    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="@*|node()">
    <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
    </xsl:template>

    <xsl:template match="houses">
    <xsl:copy>
    <xsl:apply-templates select="house">
    <xsl:sort select="mainroom/roomprice + mainroom/roomtax"
    data-type="number"
    order="descending"/>
    </xsl:apply-templates>
    </xsl:copy>
    </xsl:template>

    <xsl:template match="price/@value">
    <xsl:value-of select="
    ../../../mainroom/roomprice
    +
    ../../../mainroom/roomtax"/>
    </xsl:template>


explaining why my example is not working

您的转换不起作用,主要是因为您试图在错误的上下文中对元素进行排序(在与树中的深层子项匹配的模板内)。此外:

  • 您正在尝试通过绝对 XPath 模式来指示排序键进行排序。
  • 您没有指定所需的xsl:sort 属性
  • 您希望最终元素根据之后计算的值进行排序,而不是出现在输入文档中。这不是正确的方法。您必须始终使用输入文档中存在的值,并最终正确组合它们。

关于xml - 如何根据子元素中的新计数值对元素进行排序。 XSLT 1.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6389486/

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