【问题标题】:Missing XSLT Options for input and output XML result缺少输入和输出 XML 结果的 XSLT 选项
【发布时间】:2021-07-22 10:20:06
【问题描述】:

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

输入 XML:

<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>

预期输出:

<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>

我已经尝试使用 Key 和 generate-id() 虽然我被困在获取所有子节点的输出。根据我的分析,我得到了以下输出,但这与预期不符,似乎我在这里遗漏了一些东西,

<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:

<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>

任何建议表示赞赏。

【问题讨论】:

  • 请将您的 XSLT 添加到问题中。
  • 添加了 XSLT,您能否查看一下并告诉我这里缺少什么?
  • 请注意,XSLT 分组问题使用 XSLT 2.0+ 更容易。如果您受限于使用较旧的 XSLT 1.0 版本,请通过标记问题 xslt-10 来说明。

标签: xml xslt


【解决方案1】:

Muenchian grouping method(您试图在此处实现)有两个部分。

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

<xsl:for-each select="some-elem[generate-id() = generate-id(key('your-key', some-value)[1])]">

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

<xsl:for-each select="key('your-key', some-value)">

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

XSLT 1.0

<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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-14
    • 2014-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多