XSLT 无法根据值对节点进行分组/排序

发布于 2024-10-22 20:45:35 字数 2179 浏览 1 评论 0原文

我正在尝试转换这个 xml。但是我遇到了格式问题。有人可以指导我解决这个问题吗?预先致谢

<?xml version="1.0" encoding="windows-1252"?>
<XML>
    <Attributes>
        <Attribute>
            <id>5</id>
            <Name>Buyer ID</Name>
            <Type>common</Type>
            <Value>Lee</Value>
        </Attribute>
        <Attribute>
            <id>331</id>
            <Name>Enviornment</Name>
            <Type>common</Type>
            <Value>Development</Value>
        </Attribute>
        <Attribute>
            <id>79</id>
            <Name>Retail</Name>
            <Type>common</Type>
            <Value></Value>
        </Attribute>
        <Attribute>
            <id>402</id>
            <Name>Gender</Name>
            <Type>category</Type>
            <Value>Men</Value>
        </Attribute>
        <Attribute>
            <id>433</id>
            <Name>HeelHeight</Name>
            <Type>category</Type>
            <Value></Value>
        </Attribute>
        <Attribute>
            <id>41</id>
            <Name>PlusShip</Name>
            <Type>common</Type>
            <Value>False</Value>
            <Path></Path>
        </Attribute>
    </Attributes>
</XML>

进入以下 XML。有人可以给我一些关于如何根据属性/属性/类型的值转换此 xml 的提示吗

<?xml version="1.0" encoding="utf-8" ?>
<Data Schema="XML A">
  <Attributes type="Common">
    <Attr id="" name="Buyer ID" value="Lee" />
    <Attr id="" name="Enviornment" value="Development" />
    <Attr id="" name="Retail" value="" />
    <Attr id="" name="PlusShip" value="False" />
 </Attributes>
 <Attributes type="Category">
   <Attr id="" name="Gender" value="Men" />
   <Attr id="" name="HeelHeight" value="" />
 </Attributes>

I'm trying to transform this xml. However I'm having formatting issues. Could someone please guide me to solve this problem. Thanks in advance

<?xml version="1.0" encoding="windows-1252"?>
<XML>
    <Attributes>
        <Attribute>
            <id>5</id>
            <Name>Buyer ID</Name>
            <Type>common</Type>
            <Value>Lee</Value>
        </Attribute>
        <Attribute>
            <id>331</id>
            <Name>Enviornment</Name>
            <Type>common</Type>
            <Value>Development</Value>
        </Attribute>
        <Attribute>
            <id>79</id>
            <Name>Retail</Name>
            <Type>common</Type>
            <Value></Value>
        </Attribute>
        <Attribute>
            <id>402</id>
            <Name>Gender</Name>
            <Type>category</Type>
            <Value>Men</Value>
        </Attribute>
        <Attribute>
            <id>433</id>
            <Name>HeelHeight</Name>
            <Type>category</Type>
            <Value></Value>
        </Attribute>
        <Attribute>
            <id>41</id>
            <Name>PlusShip</Name>
            <Type>common</Type>
            <Value>False</Value>
            <Path></Path>
        </Attribute>
    </Attributes>
</XML>

Into the following XML. Could someone please give me some tips in how to transform this xml based on the value of Attributes/Attribute/Type

<?xml version="1.0" encoding="utf-8" ?>
<Data Schema="XML A">
  <Attributes type="Common">
    <Attr id="" name="Buyer ID" value="Lee" />
    <Attr id="" name="Enviornment" value="Development" />
    <Attr id="" name="Retail" value="" />
    <Attr id="" name="PlusShip" value="False" />
 </Attributes>
 <Attributes type="Category">
   <Attr id="" name="Gender" value="Men" />
   <Attr id="" name="HeelHeight" value="" />
 </Attributes>

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

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

发布评论

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

评论(1

帝王念 2024-10-29 20:45:35

以下样式表产生所需的结果:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <Data Schema="XML A">
            <xsl:apply-templates/>
        </Data>
    </xsl:template>
    <xsl:template match="Attribute[not(Type=following::Type)]">
        <Attributes type="{Type}">
            <xsl:for-each select="../Attribute[Type=current()/Type]">
               <Attr id="{id}" name="{Name}" value="{Value}"/>
            </xsl:for-each>
        </Attributes>
    </xsl:template>
    <xsl:template match="Attribute"/>
</xsl:stylesheet>

源文档上的输出:

<Data Schema="XML A">
    <Attributes type="category">
        <Attr id="402" name="Gender" value="Men"/>
        <Attr id="433" name="HeelHeight" value=""/>
    </Attributes>
    <Attributes type="common">
        <Attr id="5" name="Buyer ID" value="Lee"/>
        <Attr id="331" name="Enviornment" value="Development"/>
        <Attr id="79" name="Retail" value=""/>
        <Attr id="41" name="PlusShip" value="False"/>
    </Attributes>
</Data>

编辑: 好的,让我们摆脱那个丑陋的 for-each

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <Data Schema="XML A">
            <xsl:apply-templates/>
        </Data>
    </xsl:template>
    <xsl:template match="Attribute[not(Type=following::Type)]">
        <Attributes type="{Type}">
            <xsl:apply-templates 
                 select="../Attribute[Type=current()/Type]" mode="out"/>
        </Attributes>
    </xsl:template>
    <xsl:template match="Attribute" mode="out">
        <Attr id="{id}" name="{Name}" value="{Value}"/>
    </xsl:template>
    <xsl:template match="Attribute"/>
</xsl:stylesheet>

我感觉好多了。

编辑#2:使用 Muenchian 方法(带排序):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:key name="type" match="Attribute" use="Type"/>
    <xsl:template match="/">
        <Data Schema="XML A">
            <xsl:apply-templates select="XML/Attributes/Attribute">
                 <xsl:sort select="Type" order="descending"/>
            </xsl:apply-templates>
        </Data>
    </xsl:template>
    <xsl:template 
            match="Attribute[generate-id()=generate-id(key('type', Type)[1])]">
        <Attributes type="{Type}">
            <xsl:apply-templates 
                    select="../Attribute[Type=current()/Type]" mode="out"/>
        </Attributes>
    </xsl:template>
    <xsl:template match="Attribute" mode="out">
         <Attr id="{id}" name="{Name}" value="{Value}"/>
    </xsl:template>
    <xsl:template match="Attribute"/>
</xsl:stylesheet>

产生以下(有序)输出:

<Data Schema="XML A">
    <Attributes type="common">
        <Attr id="5" name="Buyer ID" value="Lee"/>
        <Attr id="331" name="Enviornment" value="Development"/>
        <Attr id="79" name="Retail" value=""/>
        <Attr id="41" name="PlusShip" value="False"/>
    </Attributes>
    <Attributes type="category">
        <Attr id="402" name="Gender" value="Men"/>
        <Attr id="433" name="HeelHeight" value=""/>
   </Attributes>
</Data>

The following stylesheet produces the desired result:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <Data Schema="XML A">
            <xsl:apply-templates/>
        </Data>
    </xsl:template>
    <xsl:template match="Attribute[not(Type=following::Type)]">
        <Attributes type="{Type}">
            <xsl:for-each select="../Attribute[Type=current()/Type]">
               <Attr id="{id}" name="{Name}" value="{Value}"/>
            </xsl:for-each>
        </Attributes>
    </xsl:template>
    <xsl:template match="Attribute"/>
</xsl:stylesheet>

Output on your source document:

<Data Schema="XML A">
    <Attributes type="category">
        <Attr id="402" name="Gender" value="Men"/>
        <Attr id="433" name="HeelHeight" value=""/>
    </Attributes>
    <Attributes type="common">
        <Attr id="5" name="Buyer ID" value="Lee"/>
        <Attr id="331" name="Enviornment" value="Development"/>
        <Attr id="79" name="Retail" value=""/>
        <Attr id="41" name="PlusShip" value="False"/>
    </Attributes>
</Data>

Edit: OK, let's get rid of that ugly for-each:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <Data Schema="XML A">
            <xsl:apply-templates/>
        </Data>
    </xsl:template>
    <xsl:template match="Attribute[not(Type=following::Type)]">
        <Attributes type="{Type}">
            <xsl:apply-templates 
                 select="../Attribute[Type=current()/Type]" mode="out"/>
        </Attributes>
    </xsl:template>
    <xsl:template match="Attribute" mode="out">
        <Attr id="{id}" name="{Name}" value="{Value}"/>
    </xsl:template>
    <xsl:template match="Attribute"/>
</xsl:stylesheet>

I feel much better.

Edit #2: Using the Muenchian Method (with sorting):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:key name="type" match="Attribute" use="Type"/>
    <xsl:template match="/">
        <Data Schema="XML A">
            <xsl:apply-templates select="XML/Attributes/Attribute">
                 <xsl:sort select="Type" order="descending"/>
            </xsl:apply-templates>
        </Data>
    </xsl:template>
    <xsl:template 
            match="Attribute[generate-id()=generate-id(key('type', Type)[1])]">
        <Attributes type="{Type}">
            <xsl:apply-templates 
                    select="../Attribute[Type=current()/Type]" mode="out"/>
        </Attributes>
    </xsl:template>
    <xsl:template match="Attribute" mode="out">
         <Attr id="{id}" name="{Name}" value="{Value}"/>
    </xsl:template>
    <xsl:template match="Attribute"/>
</xsl:stylesheet>

Produces the following (ordered) output:

<Data Schema="XML A">
    <Attributes type="common">
        <Attr id="5" name="Buyer ID" value="Lee"/>
        <Attr id="331" name="Enviornment" value="Development"/>
        <Attr id="79" name="Retail" value=""/>
        <Attr id="41" name="PlusShip" value="False"/>
    </Attributes>
    <Attributes type="category">
        <Attr id="402" name="Gender" value="Men"/>
        <Attr id="433" name="HeelHeight" value=""/>
   </Attributes>
</Data>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文