的一種方式做到這一點在XSLT1.0被定義該組下人名單非PID元素,由第一最前面PID元素
<xsl:key
name="fields"
match="person-list/*[not(self::pid)]"
use="generate-id(preceding-sibling::pid[1])" />
然後,對於人名單元素,你會只選擇PID的關鍵使用密鑰元素
<xsl:apply-templates select="pid" />
而且該PID匹配的模板內,你將創建一個人元素,和輸出其他元素:
<xsl:apply-templates select="key('fields', generate-id())" />
下面是完整的XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:key name="fields" match="person-list/*[not(self::pid)]" use="generate-id(preceding-sibling::pid[1])" />
<xsl:template match="person-list">
<person-list>
<xsl:apply-templates select="pid" />
</person-list>
</xsl:template>
<xsl:template match="pid">
<person>
<xsl:copy-of select="." />
<xsl:apply-templates select="key('fields', generate-id())" />
</person>
</xsl:template>
<xsl:template match="@*|node()" name="identity">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
當應用於您的示例XML時,以下是ou輸入
<person-list>
<person>
<pid>100</pid>
<pname>Tom Jones</pname>
<pdescription>Some Text</pdescription>
</person>
<person>
<pid>101</pid>
<pname>John Thomas</pname>
<pdescription></pdescription>
</person>
</person-list>
請注意,使用方法您可以爲每個人添加更多字段給您輸入文檔,而不需要修改XSLT。
另請注意,使用「身份轉換」複製現有元素。
答案是 「是」!您是使用XSLT1.0還是XSLT2.0?它總是有助於展示您迄今爲止嘗試過的XSLT,並對轉換規則進行更多解釋。另外,我不確定問題的標題是如何提及「maxOccurs = unbounded」的序列,與問題本身有關。 –
XML在我的XSD架構中被定義爲<序列maxOccurs =「unbounded」> .... 我無法想出一個更好的名字。 –
Maddin