0

我正在使用 XSLT 1.0,并且正在寻找将相关人员的 xml 文档划分为家庭。家庭是一个父母及其子女的定义。

所以这:

<person name =”A”&gt;
   <person name =”B”&gt;
      <person name =”D” />
      <person name =”E” />
   </person>
   <person name=”C”&gt;
      <person name =”F” />
      <person name =”G” />
      <person name =”H” />
   </person>
</person>

将导致:

<family id =”1”&gt;
   <person name =”A”&gt;
      <person name =”B”/>
      <person name=”C”/>
   </person>
</family>

<family id =”2”&gt;
   <person name =”B”&gt;
      <person name =”D” />
      <person name =”E” />
   </person>
</family>


<family id =”3”&gt;
   <person name=”C”&gt;
      <person name =”F”/>
      <person name =”G”/>
      <person name =”H”/>
   </person>
</family>

我怎样才能以简单的方式做到这一点?

4

1 回答 1

0

一种方法是首先查找所有将其他元素作为子元素的人元素

<xsl:apply-templates select="//person[person]"/>

然后,对于每个这样的person元素,您将复制该元素及其直接子元素

 <xsl:copy>
    <xsl:copy-of select="@*"/>
    <xsl:apply-templates select="person" mode="child"/>
 </xsl:copy>

此外,要获取家庭 id,您可以计算所有前面的person元素和祖先

<family id="{count(preceding::person[person]) + count(ancestor-or-self::person)}">

“子”模板只会复制及其属性,但不会复制子项。

这是完整的 XSLT

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

   <xsl:template match="/">
       <families>
          <xsl:apply-templates select="//person[person]"/>
       </families>
   </xsl:template>

   <xsl:template match="person[person]">
      <family id="{count(preceding::person[person]) + count(ancestor-or-self::person)}">
         <xsl:copy>
            <xsl:copy-of select="@*"/>
            <xsl:apply-templates select="person" mode="child"/>
         </xsl:copy>
      </family>
   </xsl:template>

   <xsl:template match="person" mode="child">
      <xsl:copy>
         <xsl:copy-of select="@*"/>
      </xsl:copy>
   </xsl:template>
</xsl:stylesheet>

应用于您的示例 XML 时,将输出以下内容

<families>
   <family id="1">
      <person name="A">
         <person>B</person>
         <person>C</person>
      </person>
   </family>
   <family id="2">
      <person name="B">
         <person>D</person>
         <person>E</person>
      </person>
   </family>
   <family id="3">
      <person name="C">
         <person>F</person>
         <person>G</person>
         <person>H</person>
      </person>
   </family>
</families>
于 2012-08-13T08:03:00.287 回答