检查XSLT中是否存在特定的子元素



我正在使用XSLT生成一个表,其中包含XML中每个ejerlejlighed-标记的一行(见下文)。

路径:forandringer→ejerlejligheder→ejerlejlighed

每个ejerlejlighed-标签包含一系列应该以列表示的信息,其中一个标签是可选的:anvendelse.

问题:

我的客户要求anvendelse标签的列只有在至少一个ejerlejlighed标签包含此信息时才显示。

路径forandringer→ejerlejligheder→ejerlejlighed→anvendelse

<forandringer>
<aendrings>
<changesOrder>1</changesOrder>
<sagsoperationKode>EOPEF</sagsoperationKode>
<sagsoperationBetegnelse>Oprettelse af ejerlejlighedsfællesskab</sagsoperationBetegnelse>
<hovedejendomBFEnr>3330122</hovedejendomBFEnr>
<hovedejendomType>SFE</hovedejendomType>
</aendrings>
<aendrings>
<changesOrder>2</changesOrder>
<sagsoperationKode>ENOPAH</sagsoperationKode>
<sagsoperationBetegnelse>Anden hjemmel*</sagsoperationBetegnelse>
<hovedejendomBFEnr>3330122</hovedejendomBFEnr>
<hovedejendomType>SFE</hovedejendomType>
<aktuelBFEnr>100229741</aktuelBFEnr>
<aktuelEJLnr>1</aktuelEJLnr>
<kommentar>§18</kommentar>
</aendrings>
<ejerlejligheder>
<mainPropertyBFENumber>3330122</mainPropertyBFENumber>
<ejerlejlighed>
<BFENumber>100229741</BFENumber>
<ejerlejlighedNr>1</ejerlejlighedNr>
<adresse>Ukendt adresse</adresse>
<areal>100</areal>
<fordelingstal>25/100</fordelingstal>
</ejerlejlighed>
<ejerlejlighed>
<BFENumber>100229742</BFENumber>
<ejerlejlighedNr>2</ejerlejlighedNr>
<adresse>Ukendt adresse</adresse>
<anvendelse>Erhverv</anvendelse>
<areal>200</areal>
<fordelingstal>25/100</fordelingstal>
</ejerlejlighed>
<ejerlejlighed>
<BFENumber>100229743</BFENumber>
<ejerlejlighedNr>3</ejerlejlighedNr>
<adresse>Ukendt adresse</adresse>
<areal>200</areal>
<fordelingstal>25/100</fordelingstal>
</ejerlejlighed>
<ejerlejlighed>
<BFENumber>100229744</BFENumber>
<ejerlejlighedNr>4</ejerlejlighedNr>
<adresse>Ukendt adresse</adresse>
<areal>200</areal>
<fordelingstal>25/100</fordelingstal>
</ejerlejlighed>
</ejerlejligheder>
</forandringer>
为了支持这一点,我创建了一个模板,如下所示。然而,我不知道如何根据anvendelse标签是否存在,使参数show-anvendelse的选择语句为真或假。
<xsl:call-template name="ejerlejlighed-table-only">
<xsl:with-param name="lejligheder" select="current-group()"/>
<xsl:with-param name="show-anvendelse" select="false()"/>
</xsl:call-template>

你的问题上下文不清楚。您的描述中没有任何内容表明需要分组和/或调用命名模板。

如果您要为每个ejerlejlighed创建一行,并且您希望仅在至少一个ejerlejlighedanvendelse子节点时才创建特定的列,那么显然您希望将此测试执行一次对于所有行,并在每行中使用结果—这里是一个简化的示例:

<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:template match="/forandringer">
<xsl:variable name="anvendelse" select="ejerlejligheder/ejerlejlighed/anvendelse" />
<table>
<xsl:for-each select="ejerlejligheder/ejerlejlighed">
<row>
<!-- mandatory columns -->
<xsl:if test="$anvendelse">
<optional-column>
<!-- some value -->
</optional-column>
</xsl:if>
</row>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>

尝试exists(xpath)函数:

<xsl:call-template name="ejerlejlighed-table-only">
<xsl:with-param name="lejligheder" select="current-group()"/>
<xsl:with-param name="show-anvendelse" select="exists(anvendelse)"/>
</xsl:call-template>

您可以计算anvendelse标签的数量,看看是否至少有一个值:

<xsl:call-template name="ejerlejlighed-table-only">
<xsl:with-param name="lejligheder" select="current-group()"/>
<xsl:with-param name="show-anvendelse" select="count(//ejerlejlighed/anvendelse) &gt; 0"/>
</xsl:call-template>

不清楚如何调用ejerlejlighed-table-only模板,但尽量使用count中最具体的选择器以避免性能损失。

最新更新