如何使用xsl对一行中的一组节点进行排序?

发布于 2025-01-07 07:28:09 字数 688 浏览 0 评论 0原文

下面是我的 xml,

<products>
    <product>
        <item>Pen</item>
        <price>10</price>
    </product>
    <product>
        <item>Pencil</item>
        <price>20</price>
    </product>
    <product>
        <item>Bag</item>
        <price>25</price>
    </product>
</products>

我需要如下输出

product_name       price     remark
Pen                10        Pen+Pencil+Bag
Pencil             20        Pen+Pencil+Bag
Bag                25        Pen+Pencil+Bag

我如何在 xslt 1.0 中将 remark 作为组

Below is my xml

<products>
    <product>
        <item>Pen</item>
        <price>10</price>
    </product>
    <product>
        <item>Pencil</item>
        <price>20</price>
    </product>
    <product>
        <item>Bag</item>
        <price>25</price>
    </product>
</products>

i need output like below

product_name       price     remark
Pen                10        Pen+Pencil+Bag
Pencil             20        Pen+Pencil+Bag
Bag                25        Pen+Pencil+Bag

How i do remark as group in xslt 1.0

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

森末i 2025-01-14 07:28:09

此转换

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:variable name="vSortedNames">
  <xsl:call-template name="sortedItemList"/>
 </xsl:variable>

 <xsl:template match="/*">
  <xsl:text>product_name	price	remark</xsl:text>

  <xsl:apply-templates select="*">
   <xsl:sort select="price" data-type="number"/>
  </xsl:apply-templates>
 </xsl:template>

 <xsl:template match="product">
  <xsl:value-of select=
  "concat('
', item, '	', price, '	', $vSortedNames)"/>
 </xsl:template>

 <xsl:template name="sortedItemList">
  <xsl:for-each select="/*/product">
   <xsl:sort select="price" data-type="number"/>
  <xsl:if test="not(position() = 1)">+</xsl:if>
   <xsl:value-of select="item"/>
  </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

应用于提供的 XML 文档时

<products>
    <product>
        <item>Pen</item>
        <price>10</price>
    </product>
    <product>
        <item>Pencil</item>
        <price>20</price>
    </product>
    <product>
        <item>Bag</item>
        <price>25</price>
    </product>
</products>

产生所需的正确结果

product_name    price   remark
Pen 10  Pen+Pencil+Bag
Pencil  20  Pen+Pencil+Bag
Bag 25  Pen+Pencil+Bag

This transformation:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:variable name="vSortedNames">
  <xsl:call-template name="sortedItemList"/>
 </xsl:variable>

 <xsl:template match="/*">
  <xsl:text>product_name	price	remark</xsl:text>

  <xsl:apply-templates select="*">
   <xsl:sort select="price" data-type="number"/>
  </xsl:apply-templates>
 </xsl:template>

 <xsl:template match="product">
  <xsl:value-of select=
  "concat('
', item, '	', price, '	', $vSortedNames)"/>
 </xsl:template>

 <xsl:template name="sortedItemList">
  <xsl:for-each select="/*/product">
   <xsl:sort select="price" data-type="number"/>
  <xsl:if test="not(position() = 1)">+</xsl:if>
   <xsl:value-of select="item"/>
  </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

when applied on the provided XML document:

<products>
    <product>
        <item>Pen</item>
        <price>10</price>
    </product>
    <product>
        <item>Pencil</item>
        <price>20</price>
    </product>
    <product>
        <item>Bag</item>
        <price>25</price>
    </product>
</products>

produces the wanted, correct result:

product_name    price   remark
Pen 10  Pen+Pencil+Bag
Pencil  20  Pen+Pencil+Bag
Bag 25  Pen+Pencil+Bag
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文