如何检查 XML 中是否存在 child
How to check whether one child exists in XML
我有一个 xslt-script 可以将 tei:bibl 元素转换为 HTML
<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>, François de ,
<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>, François de, /
<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>
我做错了什么?
我不是在寻找任何特定版本的 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() > 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
我有一个 xslt-script 可以将 tei:bibl 元素转换为 HTML
<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>, François de ,
<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>, François de, /
<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>
我做错了什么? 我不是在寻找任何特定版本的 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() > 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