XSLT递归函数(父子关系)

时间:2014-12-18 15:21:00

标签: xml xslt

我无法找到解决以下问题的方法:

我需要为XSLT提供一个等于a:CrsNr的属性。 现在它必须找到输入属性匹配的正确节点:CrsNr。 找到正确的节点后,需要打印从 :: 分离的高层到低层的所有定义。

节点通过Code和ParentCode链接

PS:我需要的节点之间还有其他节点。这只是一个简单的例子,完整的xml计数+ - 33.000行。

我会给你一个XML和输出示例

XML

<root xmlns:a="urn:xa" xmlns:i="urn:xi">
    <a:OrganisatieEenheid>
      <a:Code>00000001</a:Code>
      <a:Level>0</a:Level>
      <a:Definition>Antwerpen</a:Definition>
      <a:CrsNr>7001</a:CrsNr>
      <a:ParentCode i:nil="true"/>
    </a:OrganisatieEenheid>
    <a:OrganisatieEenheid>
      <a:Code>00000004</a:Code>
      <a:Level>1</a:Level>
      <a:Definition>Zorgbedrijf</a:Definition>
      <a:CrsNr>7004</a:CrsNr>
      <a:ParentCode>00000001</a:ParentCode>
    </a:OrganisatieEenheid>
    <a:OrganisatieEenheid>
      <a:Code>00000426</a:Code>
      <a:Level>2</a:Level>
      <a:Definition>Raad van Beheer</a:Definition>
      <a:CrsNr>7426</a:CrsNr>
      <a:ParentCode>00000004</a:ParentCode>
    </a:OrganisatieEenheid>
</root>

输出

<output>
   <Definition>Antwerpen::Zorgbedrijf::Raad van Beheer</Definition>
   <InputCrs>7426</InputCrs>
</output>

2 个答案:

答案 0 :(得分:1)

如果我正确地理解了你的问题(并且这是一个很大的问题),你想要的是:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:a="urn:xa"
xmlns:i="urn:xi"
exclude-result-prefixes="a i">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>

<xsl:param name="crs" select="7426"/>

<xsl:key name="org-by-crs" match="a:OrganisatieEenheid" use="a:CrsNr" />
<xsl:key name="org-by-code" match="a:OrganisatieEenheid" use="a:Code" />

<xsl:template match="/">
    <output>
        <Definition>
            <xsl:apply-templates select="key('org-by-crs', $crs)"/>
        </Definition>
        <InputCrs><xsl:value-of select="$crs"/></InputCrs>
    </output>
</xsl:template>

<xsl:template match="a:OrganisatieEenheid">
    <xsl:if test="a:ParentCode[not(@i:nil='true')]">
        <xsl:apply-templates select="key('org-by-code', a:ParentCode)"/>
        <xsl:text>::</xsl:text>
    </xsl:if>
    <xsl:value-of select="a:Definition"/>
</xsl:template>

</xsl:stylesheet>

当这适用于格式正确的输入

<root xmlns:a="urn:xa" xmlns:i="urn:xi">
    <a:OrganisatieEenheid>
      <a:Code>00000001</a:Code>
      <a:Level>0</a:Level>
      <a:Definition>Antwerpen</a:Definition>
      <a:CrsNr>7001</a:CrsNr>
      <a:ParentCode i:nil="true"/>
    </a:OrganisatieEenheid>
    <a:OrganisatieEenheid>
      <a:Code>00000004</a:Code>
      <a:Level>1</a:Level>
      <a:Definition>Zorgbedrijf</a:Definition>
      <a:CrsNr>7004</a:CrsNr>
      <a:ParentCode>00000001</a:ParentCode>
    </a:OrganisatieEenheid>
    <a:OrganisatieEenheid>
      <a:Code>00000426</a:Code>
      <a:Level>2</a:Level>
      <a:Definition>Raad van Beheer</a:Definition>
      <a:CrsNr>7426</a:CrsNr>
      <a:ParentCode>00000004</a:ParentCode>
    </a:OrganisatieEenheid>
</root>

结果将是:

<?xml version="1.0" encoding="utf-8"?>
<output>
   <Definition>Antwerpen::Zorgbedrijf::Raad van Beheer</Definition>
   <InputCrs>7426</InputCrs>
</output>

答案 1 :(得分:0)

希望这有帮助, 那么你不能拥有属性但你可以使用代表发送到xslt的外部数据的参数。

我假设该值已通过param发送

    <xsl:param name="data"/>
  <xsl:template match="/*">
    <output>
      <Definition>
        <xsl:variable name="found" select="a:OrganisatieEenheid[following-sibling::a:OrganisatieEenheid[a:CrsNr=$data]]"/>
        <xsl:variable name="data2">
          <xsl:for-each select="$found">
            <xsl:value-of select="a:Definition"/>
              <xsl:text>::</xsl:text>
          </xsl:for-each>
        </xsl:variable>
        <xsl:variable name="data3" select="a:OrganisatieEenheid[a:CrsNr=$data]/a:Definition"/>
        <xsl:value-of select="concat($data2,$data3)"/>
      </Definition>
      <InputCrs>
        <xsl:value-of select="$data"/>
      </InputCrs>
    </output>
  </xsl:template>