首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据输入xml中元素的值转换为输出xml

根据输入xml中元素的值转换为输出xml
EN

Stack Overflow用户
提问于 2017-01-05 19:16:15
回答 1查看 45关注 0票数 0

我正在努力学习XSLT的基础知识,但我被一个特定的用例所困扰。我想要实现的是将一个xml文件转换成另一个xml (我使用的是XSLT 2.0),但有一个条件是,输出xml中的元素分组由输入xml中的一个特定元素的值决定。

我将尝试通过一个虚构的例子来举例说明我的问题。

假设这是一个输入xml:

代码语言:javascript
复制
<products>
<shoes>
    <shoe>
        <name>Ecco City</name>
        <category>Urban</category>
    </shoe>
    <shoe>
        <name>Timberland Forest</name>
        <category>Wildlife</category>
    </shoe>
    <shoe>
        <name>Asics Gel-Kayano</name>
        <category>Running</category>
    </shoe>
</shoes>
<clothes>
    <shorts>
        <name>North Face</name>
        <category>Wildlife</category>
    </shorts>
    <shorts>
        <name>Adidas Running Shorts</name>
        <category>Running</category>
    </shorts>
</clothes>

根据类别元素的值,我希望为每个产品列出类似的产品,即在输入xml中具有相同类别的其他产品,如下所示:

代码语言:javascript
复制
<output>
    <forSale>
        <item>Asics Gel-Kayano</item>
        <similarItem>Adidas Running Shorts</similarItem>
    </forSale>       
</output>
EN

回答 1

Stack Overflow用户

发布于 2017-01-05 20:38:35

这似乎不是一个分组问题。如果我没理解错的话,你应该这样做:

XSLT2.0

代码语言:javascript
复制
<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:key name="product-by-category" match="*" use="category" />

<xsl:template match="/products">
    <output>
        <xsl:for-each select="*/*">
            <forSale>
                <item>
                    <xsl:value-of select="name" />
                </item>
                <xsl:for-each select="key('product-by-category', category) except .">
                    <similarItem>
                        <xsl:value-of select="name" />
                    </similarItem>
                </xsl:for-each>
            </forSale>     
        </xsl:for-each>
    </output>
</xsl:template>

</xsl:stylesheet>

应用于您的输入示例,结果将是:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<output>
   <forSale>
      <item>Ecco City</item>
   </forSale>
   <forSale>
      <item>Timberland Forest</item>
      <similarItem>North Face</similarItem>
   </forSale>
   <forSale>
      <item>Asics Gel-Kayano</item>
      <similarItem>Adidas Running Shorts</similarItem>
   </forSale>
   <forSale>
      <item>North Face</item>
      <similarItem>Timberland Forest</similarItem>
   </forSale>
   <forSale>
      <item>Adidas Running Shorts</item>
      <similarItem>Asics Gel-Kayano</similarItem>
   </forSale>
</output>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41483639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档