XSLT:来自父/子结构的递归字符串连接

时间:2017-03-31 23:23:40

标签: xslt recursion concatenation

我想在一个我无法找到解决方案的主题上提供一些帮助(而且我对于匆忙......我有点兴奋) 我在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)。

1 个答案:

答案 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