这是真实的场景,只有我更改了数据。我有以下父子关系xml。我正在尝试使用 XSLT 转换下面的 xml。我能够遍历父数据,但无法提供子节点的条件,例如子节点是否随时更改,它应该分隔样本,否则它应该由子节点分隔。
输入文件
<Samples>
<Sample>
<a1>a1name</a1>
<b1>b1desc</b1>
<c1ref>101</c1ref>
<childref>101</childref>
<eno>test</eno>
<ename>somename</ename>
</Sample>
<Sample>
<a1>a1name</a1>
<b1>b1desc</b1>
<c1ref>101</c1ref>
<childref>101</childref>
<eno>test123</eno>
<ename>someothername</ename>
</Sample>
<Sample>
<a1>a1name1</a1>
<b1>b1desc1</b1>
<c1ref>102</c1ref>
<childref>102</childref>
<eno>test1234</eno>
<ename>someothername1</ename>
</Sample>
<Sample>
<a1>a1name</a1>
<b1>b1desc</b1>
<c1ref>101</c1ref>
<childref>101</childref>
<eno>test</eno>
<ename>somename</ename>
</Sample>
<Sample>
<a1>a1name1</a1>
<b1>b1desc1</b1>
<c1ref>103</c1ref>
<childref>103</childref>
<eno>test1234</eno>
<ename>someothername1</ename>
</Sample>
</Samples>
OP没有解释的东西。可能是预期的输出文件
<Samples>
<Sample>
<a1>a1name</a1>
<b1>b1desc</b1>
<c1ref>101</c1ref>
<childs>
<childref>101</childref>
<eno>test</eno>
<ename>somename</ename>
</childs>
<childs>
<childref>101</childref>
<eno>test123</eno>
<ename>someothername</ename>
</childs>
</Sample>
<Sample>
<a1>a1name1</a1>
<b1>b1desc1</b1>
<c1ref>102</c1ref>
<childs>
<childref>102</childref>
<eno>test1234</eno>
<ename>someothername1</ename>
</childs>
</Sample>
</Samples>
下面的 XSLT 工作,但它再次重复 childref 101。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output indent="yes" method="xml"/>
<xsl:template match="Samples">
<xsl:copy>
<!-- select the first Sample -->
<xsl:apply-templates select="Sample[1]"/>
</xsl:copy> </xsl:template>
<xsl:template match="Sample">
<!-- the a1 attribute in Sample will act as the identifier
(check if it is the same element) -->
<xsl:variable name="identifier" select="a1"/>
<xsl:copy>
<xsl:apply-templates select="a1"/>
<xsl:apply-templates select="b1"/>
<xsl:apply-templates select="c1ref"/>
<xsl:element name="childs">
<xsl:apply-templates select="childref"/>
<xsl:apply-templates select="eno"/>
<xsl:apply-templates select="ename"/>
</xsl:element>
<!-- get childs of Sample with same identifier -->
<xsl:apply-templates
select="following-sibling::Sample[a1=$identifier]"
mode="SameElement"/>
</xsl:copy>
<!-- select the nex Samples with different identifier -->
<xsl:apply-templates select="following-sibling::Sample[a1!=$identifier][1]"/> </xsl:template>
<xsl:template match="Sample" mode="SameElement">
<!-- here only output the child elements -->
<xsl:element name="childs">
<xsl:apply-templates select="childref"/>
<xsl:apply-templates select="eno"/>
<xsl:apply-templates select="ename"/>
</xsl:element> </xsl:template>
<xsl:template match="*|@*|text()">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
如何编写将产生上述输出的 xslt?