首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >缺少用于输入和输出XML结果的XSLT选项

缺少用于输入和输出XML结果的XSLT选项
EN

Stack Overflow用户
提问于 2021-07-22 10:20:06
回答 1查看 53关注 0票数 0

我正在评估XSLT能否实现以下转换:

输入XML:

代码语言:javascript
复制
<ROOT>
    <A>
        <B>
            <B1>Tech1</B1>
            <B2>Tech2</B2>
            <B3>Tech3</B3>
        </B>
        <C>Microsoft</C>
    </A>
    <A>
        <B>
            <B1>Tech11</B1>
            <B2>Tech12</B2>
            <B3>Tech13</B3>
        </B>
        <C>Microsoft</C>
    </A>
    <A>
        <B>
            <B1>Tech101</B1>
            <B2>Tech102</B2>
            <B3>Tech103</B3>
        </B>
        <C>Google</C>
    </A>
    <A>
        <B>
            <B1>Tech104</B1>
            <B2>Tech105</B2>
            <B3>Tech106</B3>
        </B>
        <C>Google</C>
    </A>
    <A>
        <B>
            <B1>Tech-1</B1>
            <B2>Tech-2</B2>
            <B3>Tech-3</B3>
        </B>
        <C>IBM</C>
    </A>
</ROOT>

预期产出:

代码语言:javascript
复制
<ROOT>
    <Company>
        <C>Microsoft</C>
        <B>
            <B1>Tech1</B1>
            <B2>Tech2</B2>
            <B3>Tech3</B3>
        </B>
        <B>
            <B1>Tech11</B1>
            <B2>Tech12</B2>
            <B3>Tech13</B3>
        </B>
    </Company>
    <Company>
        <C>Google</C>
        <B>
            <B1>Tech101</B1>
            <B2>Tech102</B2>
            <B3>Tech103</B3>
        </B>
        <B>
            <B1>Tech104</B1>
            <B2>Tech105</B2>
            <B3>Tech106</B3>
        </B>
    </Company>
    <Company>
        <C>IBM</C>
        <B>
            <B1>Tech-1</B1>
            <B2>Tech-2</B2>
            <B3>Tech-3</B3>
        </B>
    </Company>
</ROOT>

我已经尝试使用这个键并生成-id(),尽管我不得不使用所有的子节点来获取输出。根据我的分析,我得到了下面的输出,但这并不是我所期望的,似乎我在这里遗漏了什么,

代码语言:javascript
复制
<ROOT>
    <Company>
        <C>Microsoft</C>
        <B>
            <B1>Tech1</B1>
            <B2>Tech2</B2>
            <B3>Tech3</B3>
        </B>
    </Company>
    <Company>
        <C>Google</C>
        <B>
            <B1>Tech101</B1>
            <B2>Tech102</B2>
            <B3>Tech103</B3>
        </B>
    </Company>
    <Company>
        <C>IBM</C>
        <B>
            <B1>Tech-1</B1>
            <B2>Tech-2</B2>
            <B3>Tech-3</B3>
        </B>
    </Company>
</ROOT>

XSLT:

代码语言:javascript
复制
<xsl:key name="Company" match="A" use="C/text()" />

<xsl:for-each select="A[generate-id()=generate-id(key('Company',C/text()))] ">
<ROOT>
  <Company>
    <C><xsl:value-of select="C/text()"/></C>
    <B>
      <B1></B1>
      <B2></B2>
      <B3></B3>
    </B>
  </Company>
</ROOT>
</xsl:for-each>

如有任何建议请见谅。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-22 10:58:41

门窗分组法 (您正在尝试在这里实现)有两个部分。

首先,为每个不同的值创建一个组--这个部分可以如下所示:

代码语言:javascript
复制
<xsl:for-each select="some-elem[generate-id() = generate-id(key('your-key', some-value)[1])]">

然后为当前组的每个成员做一些事情--通常是:

代码语言:javascript
复制
<xsl:for-each select="key('your-key', some-value)">

应用于您的示例,这将转换为:

XSLT1.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="Company" match="A" use="C" />

<xsl:template match="/ROOT">
    <ROOT>
        <xsl:for-each select="A[generate-id()=generate-id(key('Company',C))] ">
            <Company>
                <xsl:copy-of select="C"/>
                <xsl:copy-of select="key('Company',C)/B"/>
            </Company>
        </xsl:for-each>
    </ROOT>
</xsl:template>

</xsl:stylesheet>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68483137

复制
相关文章

相似问题

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