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

Check for existence of specific child element in XSLT

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

路径:forandringer->ejerlejlighed->ejerlejlighed

每个 ejerlejlighed 标签包含一系列信息,这些信息应以列的形式显示,其中一个标签是可选的:anvendelse.

问题:

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

andringer->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 的 select 语句为真或假。

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

尝试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>

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

如果您要为每个 ejerlejlighed 创建一行,并且您只想在至少一个 ejerlejlighed 有一个 anvendelse 子项时创建一个特定的列,那么显然您想要对所有行进行此测试一次,并在每一行中使用结果 - 这是一个简化的示例:

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

您可以统计 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 中使用最具体的选择器以避免性能损失。