如何检查 XML 中是否存在一个孩子

问题描述

我有一个将 tei:bibl 元素转换为 HTML 的 xslt 脚本

<xsl:template match="tei:bibl//tei:author">
    <span class="smallcaps">
        <xsl:apply-templates select="tei:surname"/>
    </span>
    <xsl:text>,</xsl:text>
    <xsl:apply-templates select="tei:forename"/>
    <xsl:if test="tei:nameLink">
        <xsl:text> </xsl:text>
        <xsl:apply-templates select="tei:nameLink"/>
    </xsl:if>
    <xsl:apply-templates select="text()"/>
    <xsl:text>,</xsl:text>
    <xsl:if test=".[following-sibling::tei:author]">
    <xsl:text> / </xsl:text> 
        <span class="smallcaps">
            <xsl:text> </xsl:text>
            <xsl:apply-templates select="tei:surname"/>
        </span>
        <xsl:text>,</xsl:text>
        <xsl:apply-templates select="tei:forename"/>
        <xsl:if test="tei:nameLink">
            <xsl:text> </xsl:text>
            <xsl:apply-templates select="tei:nameLink"/>
        </xsl:if>
        <xsl:text>,</xsl:text>
    </xsl:if>
</xsl:template>

XML 如下所示:

        <bibl xml:id="capitani_ua_bannerherr">
            <abbr>
                <surname type="author">Capitani</surname> u.a.,Bannerherr</abbr>
            <author>
                <forename>François</forename>
                <nameLink>de</nameLink>
                <surname>Capitani</surname>
            </author>
            <author>
                <surname>Weck</surname>
                <forename>Hervé</forename>
                <nameLink>de</nameLink>
            </author>
            <title>Bannerherr [venner]</title>
            <bibl>
                <title>Historisches Lexikon der Schweiz (HLS)</title>
                <date>Version vom 07.05.2009</date>
            </bibl>
            <ref target="http://www.hls-dhs-dss.ch/textes/d/D8612.PHP" type="ex">[Online]</ref>
        </bibl>

我的 HTML 是这样的:

<span id="capitani_ua_bannerherr" class="rs-ref">
    <span class="smallcaps">Capitani</span>,François de,/ 
    <span class="smallcaps"> Capitani</span>,<span class="smallcaps">Weck</span>,Hervé de,Bannerherr [venner],in: Historisches Lexikon der Schweiz (HLS),Version vom 07.05.2009<a href="http://www.hls-dhs-dss.ch/textes/d/D8612.PHP"> [Online]
</a>.
</span>

模板按预期执行。但是,它将第一个条目加倍(此处为 <span class="smallcaps"> Vapitani </span>,Francois de,

我尝试添加一个看起来像这样的 <xsl:choose>

<xsl:template match="tei:bibl//tei:author">
        <xsl:choose>
            <xsl:when test="[count(tei:bibl//tei:author)=1]">
                <span class="smallcaps">
                    <xsl:apply-templates select="tei:surname"/>
                </span>
                <xsl:text>,</xsl:text>
                <xsl:apply-templates select="tei:forename"/>
                    <xsl:if test="tei:nameLink">
                        <xsl:text> </xsl:text>
                        <xsl:apply-templates select="tei:nameLink"/>
                    </xsl:if>
                <xsl:apply-templates select="text()"/>
                <xsl:text>,</xsl:text>
            </xsl:when>
            <xsl:when test=".[following-sibling::tei:author]">
        <xsl:text> / </xsl:text>
            <span class="smallcaps">
                <xsl:text> </xsl:text>
                <xsl:apply-templates select="tei:surname"/>
            </span>
            <xsl:text>,</xsl:text>
            <xsl:apply-templates select="tei:forename"/>
            <xsl:if test="tei:nameLink">
                <xsl:text> </xsl:text>
                <xsl:apply-templates select="tei:nameLink"/>
            </xsl:if>
            <xsl:text>,</xsl:text>
        </xsl:when>
        </xsl:choose>

</xsl:template>

这应该产生如下输出

<span id="capitani_ua_bannerherr" class="rs-ref">
        <span class="smallcaps">Capitani</span>,/ 
        <span class="smallcaps">Weck</span>,Version vom 07.05.2009<a href="http://www.hls-dhs-dss.ch/textes/d/D8612.PHP"> [Online]
    </a>.
</span>

我做错了什么? 我不是在寻找任何特定版本的 XSLT,我们可以使用 XSLT 1 -3。

一切顺利, K

解决方法

您当前的模板显示“如果有以下作者,则输出姓氏和名字”。它说“输出以下作者的姓氏和名字”。

我不是 100% 确定,但您似乎想要以下内容:

  • 每个<tei:bib>的作者列表
  • 第二作者与第一作者用 / 分隔
  • 任何其他作者以 , 分隔

让我们像这样写下来:

<xsl:template match="tei:bibl//tei:author">
    <xsl:if test="position() = 2"> / </xsl:if>
    <xsl:if test="position() &gt; 2">,</xsl:if>
    <span class="smallcaps">
        <xsl:apply-templates select="tei:surname" />
    </span>
    <xsl:text>,</xsl:text>
    <xsl:apply-templates select="tei:forename" />
    <xsl:if test="tei:nameLink">
        <xsl:text> </xsl:text>
        <xsl:apply-templates select="tei:nameLink" />
    </xsl:if>
</xsl:template>

现在您可以直接调用它

<xsl:template match="tei:bibl">
    <xsl:apply-templates select="tei:author" />
    <!-- ...output the title etc here --->
</xsl:template>

并获取(为了可读性而格式化):

<span xmlns:tei="tei" class="smallcaps">Capitani</span>,François de
/ <span xmlns:tei="tei" class="smallcaps">Weck</span>,Hervé de

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...