2

我在使用 XSLT 进行分组时遇到问题。这是我的示例: 这是输入文件:

 <HeadNr>
  <nummerK>989</nummerK>
  </HeadNr>

     <Qua>
      <Abrufd>921</Abrufd>
      <Abrufm>20</Abrufm>
      <Summe>103,1</Summe>
      <Einzel>42,1</Einzel>
    </Qua>

    <HeadNr>
  <nummerK>911</nummerK>
  </HeadNr>

     <Qua>
      <Abrufd>321</Abrufd>
      <Abrufm>40</Abrufm>
      <Summe>143,1</Summe>
      <Einzel>222,1</Einzel>
    </Qua>

    <HeadNr>
  <nummerK>989</nummerK>
  </HeadNr>

     <Qua>
      <Abrufd>922</Abrufd>
      <Abrufm>204</Abrufm>
      <Summe>1033,1</Summe>
      <Einzel>4222,1</Einzel>
    </Qua>

这是输出文件:

<root>
<HeadNr>
  <nummerK>989</nummerK>
  </HeadNr>

     <Qua>
      <Abrufd>921</Abrufd>
      <Abrufm>20</Abrufm>
      <Summe>103,1</Summe>
      <Einzel>42,1</Einzel>
    </Qua>
 </root>
 <root>   
    <HeadNr>
  <nummerK>911</nummerK>
  </HeadNr>

     <Qua>
      <Abrufd>321</Abrufd>
      <Abrufm>40</Abrufm>
      <Summe>143,1</Summe>
      <Einzel>222,1</Einzel>
    </Qua>
 </root>
 <root>   
    <HeadNr>
  <nummerK>989</nummerK>
  </HeadNr>

     <Qua>
      <Abrufd>922</Abrufd>
      <Abrufm>204</Abrufm>
      <Summe>1033,1</Summe>
      <Einzel>4222,1</Einzel>
    </Qua>
</root>

我需要将标签以及它们之间的所有内容放在标签中。谢谢你,对不起我的英语。

4

2 回答 2

1

这种转变

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*" name="identity">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="HeadNr">
  <root>
   <HeadNr>
     <xsl:apply-templates/>
   </HeadNr>
   <xsl:apply-templates select="following-sibling::Qua[1]" mode="inGroup"/>
  </root>
 </xsl:template>

 <xsl:template match="Qua" mode="inGroup"><xsl:call-template name="identity"/></xsl:template>
 <xsl:template match="Qua"/>
</xsl:stylesheet>

当应用于此 XML 文档时(提供的片段包装在单个顶部元素中):

<t>
    <HeadNr>
        <nummerK>989</nummerK>
    </HeadNr>
    <Qua>
        <Abrufd>921</Abrufd>
        <Abrufm>20</Abrufm>
        <Summe>103,1</Summe>
        <Einzel>42,1</Einzel>
    </Qua>
    <HeadNr>
        <nummerK>911</nummerK>
    </HeadNr>
    <Qua>
        <Abrufd>321</Abrufd>
        <Abrufm>40</Abrufm>
        <Summe>143,1</Summe>
        <Einzel>222,1</Einzel>
    </Qua>
    <HeadNr>
        <nummerK>989</nummerK>
    </HeadNr>
    <Qua>
        <Abrufd>922</Abrufd>
        <Abrufm>204</Abrufm>
        <Summe>1033,1</Summe>
        <Einzel>4222,1</Einzel>
    </Qua>
</t>

产生想要的正确结果

<t>
   <root>
      <HeadNr>
         <nummerK>989</nummerK>
      </HeadNr>
      <Qua>
         <Abrufd>921</Abrufd>
         <Abrufm>20</Abrufm>
         <Summe>103,1</Summe>
         <Einzel>42,1</Einzel>
      </Qua>
   </root>
   <root>
      <HeadNr>
         <nummerK>911</nummerK>
      </HeadNr>
      <Qua>
         <Abrufd>321</Abrufd>
         <Abrufm>40</Abrufm>
         <Summe>143,1</Summe>
         <Einzel>222,1</Einzel>
      </Qua>
   </root>
   <root>
      <HeadNr>
         <nummerK>989</nummerK>
      </HeadNr>
      <Qua>
         <Abrufd>922</Abrufd>
         <Abrufm>204</Abrufm>
         <Summe>1033,1</Summe>
         <Einzel>4222,1</Einzel>
      </Qua>
   </root>
</t>

请注意

这种转换看起来比只使用<xsl:copy-of>. 但是,它更加灵活和可扩展,允许定义与组内元素匹配的其他模板。

于 2012-09-20T12:12:34.620 回答
1

看起来您正在尝试将HeadNr元素与第一个Qua兄弟元素“分组”。

假设您的输入 XML 具有 XML 的根元素,您只需选择HeadNr元素即可

<xsl:apply-templates select="HeadNr" />

然后您将有一个模板来匹配这些,如果您创建元素并复制当前元素和以下Qua元素。

这是完整的 XSLT

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

   <xsl:template match="/*">
      <xsl:apply-templates select="HeadNr" />
   </xsl:template>

   <xsl:template match="HeadNr">
      <root>
         <xsl:copy-of select="." />
         <xsl:copy-of select="following-sibling::Qua[1]" />
      </root>
   </xsl:template>
</xsl:stylesheet>

当应用于您的 XML(当给定根元素时)时,输出以下内容

<root>
    <HeadNr>
        <nummerK>989</nummerK>
    </HeadNr>
    <Qua>
        <Abrufd>921</Abrufd>
        <Abrufm>20</Abrufm>
        <Summe>103,1</Summe>
        <Einzel>42,1</Einzel>
    </Qua>
</root>
<root>
    <HeadNr>
        <nummerK>911</nummerK>
    </HeadNr>
    <Qua>
        <Abrufd>321</Abrufd>
        <Abrufm>40</Abrufm>
        <Summe>143,1</Summe>
        <Einzel>222,1</Einzel>
    </Qua>
</root>
<root>
    <HeadNr>
        <nummerK>989</nummerK>
    </HeadNr>
    <Qua>
        <Abrufd>922</Abrufd>
        <Abrufm>204</Abrufm>
        <Summe>1033,1</Summe>
        <Einzel>4222,1</Einzel>
    </Qua>
</root>
于 2012-09-20T12:03:48.823 回答