1

我的输入 xml 没有正确分组的节点很少。它们只是串行方式。我需要创建一个父节点并使用 XSLT 将它们放在以下结构中......我正在尝试没有任何运气。反过来似乎很容易。任何人都可以帮助快速 XSLT。

感谢您的时间

输入.XML

<root>
 <info>
  <name>papa</name>
  <age>10</age>

   <groupkey>1</groupkey>
   <groupkey>2</groupkey>
   <groupkey>2</groupkey>


   <groupname>n1</groupname>
   <groupname>n2</groupname>
   <groupname>n3</groupname>



 </info>
</root>

愿望输出

<root>
 <info>
  <name>papa</name>
  <age>10</age>

     <groups>

       <group>
          <groupkey>1</groupkey>
          <groupname>n1</groupname>
       </group>

      <group>
          <groupkey>2</groupkey>
          <groupname>n2</groupname>
       </group>

       <group>
          <groupkey>3</groupkey>
          <groupname>n3</groupname>
       </group>



     </groups>

 </info>
</root>

添加以下内容

非常感谢诺瓦切夫。我测试了它,正是我想要的。它也是通用的。
最后一个问题请。如果我有另一个名为地址的节点,如下所示,我将如何合并它。请帮忙。谢谢你的时间。

输入

<root>
 <info>
  <name>papa</name>
  <age>10</age>

    <groupkey>1</groupkey>
    <groupkey>2</groupkey>
    <groupkey>3</groupkey>

    <groupname>n1</groupname>
    <groupname>n2</groupname>
    <groupname>n3</groupname>



    <addresskey>1</addresskey>
    <addresskey>2</addresskey>
    <addresskey>3</addresskey>

    <addressname>a1</addressname>
    <addressname>a2</addressname>
    <addressname>a3</addressname>  


 </info>
</root>

输出

<root>
 <info>
  <name>papa</name>
  <age>10</age>

     <groups>

       <group>
          <groupkey>1</groupkey>
          <groupname>n1</groupname>
       </group>

      <group>
          <groupkey>2</groupkey>
          <groupname>n2</groupname>
       </group>

       <group>
          <groupkey>3</groupkey>
          <groupname>n3</groupname>
       </group>

     </groups>


      <addresses>

            <address>
               <addresskey>1</addresskey>
               <addressname>a1</addressname>
            </address>

           <address>
               <addresskey>2</addresskey>
               <addressname>a2</addressname>
            </address>

            <address>
               <addresskey>3</addresskey>
               <addressname>a3</addressname>
            </address>

     </addresses>



 </info>
</root>
4

1 回答 1

0

这种转变

<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="age">
  <xsl:call-template name="identity"/>
  <groups>
    <xsl:apply-templates select="following-sibling::groupkey" mode="grouping"/>
  </groups>
 </xsl:template>

 <xsl:template match="groupkey" mode="grouping">
  <group>
    <xsl:variable name="vPos" select="position()"/>
    <xsl:call-template name="identity"/>
    <xsl:apply-templates mode="grouping" select="../groupname[$vPos]"/>
  </group>
 </xsl:template>

 <xsl:template match="groupname" mode="grouping">
   <xsl:call-template name="identity"/>
 </xsl:template>

 <xsl:template match="groupkey|groupname"/>
</xsl:stylesheet>

当应用于提供的 XML 文档时(带有更正的 3rd groupkey):

<root>
 <info>
  <name>papa</name>
  <age>10</age>

   <groupkey>1</groupkey>
   <groupkey>2</groupkey>
   <groupkey>3</groupkey>

   <groupname>n1</groupname>
   <groupname>n2</groupname>
   <groupname>n3</groupname>

 </info>
</root>

产生想要的正确结果

<root>
   <info>
      <name>papa</name>
      <age>10</age>
      <groups>
         <group>
            <groupkey>1</groupkey>
            <groupname>n1</groupname>
         </group>
         <group>
            <groupkey>2</groupkey>
            <groupname>n2</groupname>
         </group>
         <group>
            <groupkey>3</groupkey>
            <groupname>n3</groupname>
         </group>
      </groups>
   </info>
</root>

更新

与此同时,OP 通过添加第二类数据(地址信息)存在于 XML 文档中并且必须以类似方式分组的要求来更新问题。

这是更新的解决方案

<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="age">
  <xsl:call-template name="identity"/>
  <groups>
    <xsl:apply-templates select="following-sibling::groupkey" mode="grouping"/>
  </groups>
  <addresses>
    <xsl:apply-templates select="following-sibling::addresskey" mode="grouping"/>
  </addresses>

 </xsl:template>

 <xsl:template match="groupkey" mode="grouping">
  <group>
    <xsl:variable name="vPos" select="position()"/>
    <xsl:call-template name="identity"/>
    <xsl:apply-templates mode="grouping" select="../groupname[$vPos]"/>
  </group>
 </xsl:template>

 <xsl:template match="addresskey" mode="grouping">
  <address>
    <xsl:variable name="vPos" select="position()"/>
    <xsl:call-template name="identity"/>
    <xsl:apply-templates mode="grouping" select="../addressname[$vPos]"/>
  </address>
 </xsl:template>

 <xsl:template match="groupname|addressname" mode="grouping">
   <xsl:call-template name="identity"/>
 </xsl:template>

 <xsl:template match="groupkey|groupname|addresskey|addressname"/>
</xsl:stylesheet>

当此转换应用于新指定的 XML 文档时

<root>
 <info>
  <name>papa</name>
  <age>10</age>

    <groupkey>1</groupkey>
    <groupkey>2</groupkey>
    <groupkey>3</groupkey>

    <groupname>n1</groupname>
    <groupname>n2</groupname>
    <groupname>n3</groupname>



    <addresskey>1</addresskey>
    <addresskey>2</addresskey>
    <addresskey>3</addresskey>

    <addressname>a1</addressname>
    <addressname>a2</addressname>
    <addressname>a3</addressname>


 </info>
</root>

再次产生所需的正确结果:

<root>
   <info>
      <name>papa</name>
      <age>10</age>
      <groups>
         <group>
            <groupkey>1</groupkey>
            <groupname>n1</groupname>
         </group>
         <group>
            <groupkey>2</groupkey>
            <groupname>n2</groupname>
         </group>
         <group>
            <groupkey>3</groupkey>
            <groupname>n3</groupname>
         </group>
      </groups>
      <addresses>
         <address>
            <addresskey>1</addresskey>
            <addressname>a1</addressname>
         </address>
         <address>
            <addresskey>2</addresskey>
            <addressname>a2</addressname>
         </address>
         <address>
            <addresskey>3</addresskey>
            <addressname>a3</addressname>
         </address>
      </addresses>
   </info>
</root>
于 2012-09-02T06:06:59.617 回答