【发布时间】:2012-08-27 22:03:49
【问题描述】:
这是真实的场景,只是我更改了数据。我有以下父子关系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 以产生上述输出?
【问题讨论】:
-
您好 SSdev,我很想推荐一个 Muenchian 分组(例如 stackoverflow.com/questions/1753485/…)。你试过了吗?最好的问候,彼得
-
我使用的上述 XSLT 几乎是正确的,只是它再次重复了已经包含在
标记中的子节点。 -
SSdev,您在样式表中说“version=1.0”并将其标记为“xslt-2.0”。我下面的解决方案是 1.0。下次请注意这些规范,因为 XSLT 1.0 和 2.0 在分组方面存在很大差异。
-
SSdev,除非您编辑问题并提供所需的确切结果,否则无论读者的精神力量如何,都无法猜到。请。
-
@Peter:这个问题被标记为 xslt-1.0。删除该标签的不是 SSdev。
标签: xslt grouping xslt-1.0 xslt-2.0