簡體   English   中英

在XSLT中循環和級聯父子節點

[英]Looping and concatenating parent child node in XSLT

我有一個XML看起來像這樣:

<School>
<Class>
    <Student1>Student1</Student1>
</Class>
<Major>
    <Name1>Name1</Name1>    
    <List>
        <Title1>Title1</Title1>
    </List>
    <List>
        <Title2>Title2</Title2>
    </List>
</Major>
<Class>
    <Student2>Student2</Student2>
</Class>
<Major>
    <Name2>Name2</Name2>    
    <List>
        <Title3>Title3</Title3>
    </List>
    <List>
        <Title4>Title4</Title4>
    </List>
</Major></School>

Class&Major的節點具有許多序列。 我為每個樣本輸入2個樣本。 第一個班級將與第一個專業班級合並,並且將通過循環“班級和專業班級”節點來拆分“列表”節點。 這將發生在二等和二等專業中。

這是我想要的輸出:

<School>
<Class>
    <Student1>Student1</Student1>
    <Name1>Name1</Name1>
    <List>
        <Title1>Title1</Title1>
    </List>
</Class>
<Class>
    <Student1>Student1</Student1>
    <Name1>Name1</Name1>
    <List>
        <Title2>Title2</Title2>
    </List>
</Class>    
<Class>
    <Student2>Student2</Student2>
    <Name2>Name2</Name2>
    <List>
        <Title3>Title3</Title3>
    </List>
</Class>
    <Class>
    <Student2>Student2</Student2>
    <Name2>Name2</Name2>
    <List>
        <Title4>Title4</Title4>
    </List>
</Class></School>

如何將XML轉換為所需的輸出?

本質上,您希望每個Major\\List元素都有一個單獨的Class元素,因此,一種選擇方法是從選擇Major\\List元素開始

<xsl:apply-templates select="Major/List" />

然后,您將擁有一個與List匹配的模板,您可以在其中創建Class元素並添加所有必需的元素。 例如:

<xsl:template match="List">
  <Class>
    <xsl:apply-templates select="../preceding-sibling::Class[1]/*" />
    <xsl:apply-templates select="../*[not(self::List)]" />
    <xsl:call-template name="identity" />
  </Class>
</xsl:template>

試試這個XSLT。 請注意,這假設每個Class始終會有一個Major元素,並且每個Major將至少存在一個List

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

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

  <xsl:template match="School">
    <xsl:copy>
      <xsl:apply-templates select="Major/List" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="List">
    <Class>
      <xsl:apply-templates select="../preceding-sibling::Class[1]/*" />
      <xsl:apply-templates select="../*[not(self::List)]" />
      <xsl:call-template name="identity" />
    </Class>
  </xsl:template>
</xsl:stylesheet>

請注意,使用身份模板可以在所有其他節點之間進行復制而無需更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM