[英]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.