我想在一个我无法找到解决方案的主题上提供一些帮助(而且我对于匆忙......我有点兴奋) 我在XSLT中的平均水平,这一点超出了我的技能。
我的源XML有一个组织为Child / Parent的树结构,已经用顶级节点排序。
EDITED:为部门节点添加了顶部封闭。 这是一个例子:
<AllDepartments>
<Department>
<Code>1</Code>
<ParentCode></ParentCode>
<Label>IT</Label>
</Department>
<Department>
<Code>2</Code>
<ParentCode>1</ParentCode>
<Label>Security</Label>
</Department>
<Department>
<Code>3</Code>
<ParentCode>2</ParentCode>
<Label>SSO</Label>
</Department>
</AllDepartments>
我希望将输出格式化为:
<AllDepartments>
<Department>
<Code>1</Code>
<ParentCode></ParentCode>
<Label>IT</Label>
</Department>
<Department>
<Code>2</Code>
<ParentCode>1</ParentCode>
<Label>Security</Label>
</Department>
<Department>
<Code>3</Code>
<ParentCode>1.2</ParentCode>
<Label>SSO</Label>
</Department>
</AllDepartments>
这意味着,一旦到达第3级,ParentCode应该是所有ParentCode祖先(包括ParentCode本身)的串联,并以点作为分隔符。 最大级别深度为7,因此我一直在寻找递归级联算法。
我已经尝试了一些XSL我也很羞于显示(尝试调用模板,应用模板)... 我找过类似的主题,找到了一些但不是&#34;简单&#34;就我而言。
任何帮助都将受到赞赏(允许XSLT 2.0)。
答案 0 :(得分:0)
首先,您需要一个格式正确的 XML输入,其中包含一个根元素,例如:
<强> XML 强>
<xsl:stylesheet version="1.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="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:key name="parent" match="Department" use="Code" />
<xsl:template match="ParentCode">
<xsl:copy>
<xsl:apply-templates select="key('parent', .)" mode="parent"/>
<xsl:value-of select="."/>
</xsl:copy>
</xsl:template>
<xsl:template match="Department" mode="parent">
<xsl:if test="string(ParentCode)">
<xsl:apply-templates select="key('parent', ParentCode)" mode="parent"/>
<xsl:value-of select="ParentCode"/>
<xsl:text>.</xsl:text>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
然后你可以使用:
XSLT 1.0
<?xml version="1.0" encoding="UTF-8"?>
<Departments>
<Department>
<Code>1</Code>
<ParentCode/>
<Label>IT</Label>
</Department>
<Department>
<Code>2</Code>
<ParentCode>1</ParentCode>
<Label>Security</Label>
</Department>
<Department>
<Code>3</Code>
<ParentCode>1.2</ParentCode>
<Label>SSO</Label>
</Department>
</Departments>
得到:
<强>结果强>
hdf5 compiler