我有以下输入:
<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值,并将这些节点集应用于不同的位置。
非常感谢任何见解!
答案 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>