我无法找到解决以下问题的方法:
我需要为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>
答案 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>