xslt写入for-each中的上下文的叔叔

时间:2014-12-02 01:42:46

标签: xml xslt

我有以下输入:

<element1>
    <elelment2/>
</element1>

我从一堆文件中抓取一个节点集,并插入尽可能多的元素,如我在节点集中找到的那样:

<xsl:variable name="root" select="/" />
<xsl:variable name="id" saxon:assignable="yes" select="0"/>

<xsl:variable name="views" select="collection('file:/C:/temp/?select=*.xml;recurse=yes')"/>    

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

<xsl:template match="/element1/element2">
    <xsl:copy>
        <xsl:apply-templates select="@* | *"/> 
        <xsl:for-each select="$views/element3[somefilter]">             
            <element3 name="{@name}" xmi.id="{$id}"/>

           <saxon:assign name="id"><xsl:value-of select="$id+1"/></saxon:assign>
       </xsl:for-each>
    </xsl:copy>
</xsl:template>

这对于获得以下内容非常有用:

<element1>
    <elelment2>
        <element3 name="view1" id="0"/>
        <element3 name="view2" id="1"/>
        <element3 name="view3" id="2"/>
    </element2>
</element1>

但我想做的是使用相同的节点集信息来创建父元素,以便最终输出为:

<element1>
    <elelment2>
        <element3 name="view1" id="0"/>
        <element3 name="view2" id="1"/>
        <element3 name="view3" id="2"/>
    </element2>
    <element2 name="view1" id="0"/>
    <element2 name="view2" id="1"/>
    <element2 name="view3" id="2"/>
</element1>

因此,生成的id和名称必须排列在树的不同级别,但不是彼此的祖先或子级。

element2和element3完全不同,因此我可能会尝试同时从同一数据生成两个节点集,因为它们存在id值,并将这些节点集应用于不同的位置。

非常感谢任何见解!

1 个答案:

答案 0 :(得分:0)

我不太清楚你在哪里创建&#34;父元素&#34;。为什么不试试像:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:variable name="views" select="collection('file:/C:/temp/?select=*.xml;recurse=yes')"/>    

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

<xsl:template match="element1">
    <xsl:copy>
        <xsl:apply-templates select="@* | *"/> 
        <xsl:for-each select="$views/element3">             
            <element2 name="{@name}" id="{position()}"/>
        </xsl:for-each>
    </xsl:copy>
</xsl:template>

<xsl:template match="element2">
    <xsl:copy>
        <xsl:apply-templates select="@* | *"/> 
        <xsl:for-each select="$views/element3">             
            <element3 name="{@name}" xmi.id="{position()}"/>
        </xsl:for-each>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>