XSLT 2.0 分离两个递归输出
XSLT 2.0 separating two recursive outputs
XSLT fiddle 此处:https://xsltfiddle.liberty-development.net/bdxtqU/5
这个问题源于 我想输出的含义,使用 XSLT 2.0,<persName>
到 HTML URL,其中 <persName>
可以在另一个<persName>
里面找到,所以都变成了URLs.
<persName nymRef="#Raimunda_Faure">Raimunda uxor
<persName nymRef="#Bernard_Faure_Senior">Bernardi Fabri
senior</persName></persName>
输出到:
<a href="www.foo.com/person/Raimunda_Faure">Raimunda
uxor</a><a href="www.foo.com/person/Bernard_Faure_Senior">Bernardi
Fabri<a>
使用下面找到的代码。我也将它用于另一个 'named entity' 输出到 URL, <placeName>
.
问题是 <persName>
可以像这样出现在 <placeName>
中(反之亦然):
<placeName type="event_loc" nymRef="#home_of_Guilhem_Vidal">in domo
<persName nymRef="#Guilhem_Vidal_MSP-AU" role="own">Willelmi Vitalis</persName></placeName>
我想要的是 <placeName>
和 <persName>
的分离,这样它们只创建嵌套的 URLs,其中相同的命名实体类型嵌套在命名实体中.
示意性地,这些将递归输出所有 <placeName>
和 <persName>
:
<persName>text
<persName>text</persname>
<persName>text</persname>
</persName>
<placeName>text
<placeName>text</placename>
<placeName>text</placename>
</placeName>
但是这些只会将父实体输出为 URL,无论是 <placeName>
还是 <persName>
,并绕过其中包含的命名实体:
<persName nymRef="#Raimunda_Faure">Raimunda
<placeName nymRef="#Toulouse">Toulouse</placename>
<placeName nymRef="Paris">Paris</placename>
</persName>
输出到<a href="www.foo.com/person/Raimunda_Faure">Raimunda Toulouse Paris</a>
<placeName nymRef="#Toulouse">Toulouse
<persName nymRef="#Raimunda_Faure">Raimunda</persname>
<persName nymRef="#Bernard_Faure">Bernard</persname>
</placeName>
输出到<a href="www.foo.com/place/Toulosue">Toulouse Raimunda Bernard</a>
这是两个现有的模板:
<xsl:template match="tei:text//tei:persName">
<xsl:variable name="nested" select="tei:persName[1]|
tei:persName[1]/following-sibling::node()" />
<xsl:element name="a">
<xsl:attribute name="href"><xsl:value-of select="concat($paramPersonurl,substring-after(@nymRef,'#'))"/></xsl:attribute>
<xsl:apply-templates select="node() except $nested" />
</xsl:element>
<xsl:apply-templates select="$nested" />
</xsl:template>
<xsl:template match="tei:text//tei:placeName">
<xsl:variable name="nested" select="tei:placeName[1]|
tei:placeName[1]/following-sibling::node()" />
<xsl:element name="a">
<xsl:attribute name="href"><xsl:value-of select="concat($paramPersonurl,substring-after(@nymRef,'#'))"/></xsl:attribute>
<xsl:apply-templates select="node() except $nested" />
</xsl:element>
<xsl:apply-templates select="$nested" />
</xsl:template>
看来我应该使用 [node()[name() != 'persName']]
之类的方法将另一个命名实体排除在 <xsl:apply-templates select="node() except $nested" />
或 <xsl:apply-templates select="$nested" />
中,但我没有成功。
提前致谢。
添加模板
<xsl:template match="tei:persName/tei:placeName | tei:placeName/tei:persName">
<xsl:apply-templates/>
</xsl:template>
XSLT fiddle 此处:https://xsltfiddle.liberty-development.net/bdxtqU/5
这个问题源于 <persName>
到 HTML URL,其中 <persName>
可以在另一个<persName>
里面找到,所以都变成了URLs.
<persName nymRef="#Raimunda_Faure">Raimunda uxor
<persName nymRef="#Bernard_Faure_Senior">Bernardi Fabri
senior</persName></persName>
输出到:
<a href="www.foo.com/person/Raimunda_Faure">Raimunda
uxor</a><a href="www.foo.com/person/Bernard_Faure_Senior">Bernardi
Fabri<a>
使用下面找到的代码。我也将它用于另一个 'named entity' 输出到 URL, <placeName>
.
问题是 <persName>
可以像这样出现在 <placeName>
中(反之亦然):
<placeName type="event_loc" nymRef="#home_of_Guilhem_Vidal">in domo
<persName nymRef="#Guilhem_Vidal_MSP-AU" role="own">Willelmi Vitalis</persName></placeName>
我想要的是 <placeName>
和 <persName>
的分离,这样它们只创建嵌套的 URLs,其中相同的命名实体类型嵌套在命名实体中.
示意性地,这些将递归输出所有 <placeName>
和 <persName>
:
<persName>text
<persName>text</persname>
<persName>text</persname>
</persName>
<placeName>text
<placeName>text</placename>
<placeName>text</placename>
</placeName>
但是这些只会将父实体输出为 URL,无论是 <placeName>
还是 <persName>
,并绕过其中包含的命名实体:
<persName nymRef="#Raimunda_Faure">Raimunda
<placeName nymRef="#Toulouse">Toulouse</placename>
<placeName nymRef="Paris">Paris</placename>
</persName>
输出到<a href="www.foo.com/person/Raimunda_Faure">Raimunda Toulouse Paris</a>
<placeName nymRef="#Toulouse">Toulouse
<persName nymRef="#Raimunda_Faure">Raimunda</persname>
<persName nymRef="#Bernard_Faure">Bernard</persname>
</placeName>
输出到<a href="www.foo.com/place/Toulosue">Toulouse Raimunda Bernard</a>
这是两个现有的模板:
<xsl:template match="tei:text//tei:persName">
<xsl:variable name="nested" select="tei:persName[1]|
tei:persName[1]/following-sibling::node()" />
<xsl:element name="a">
<xsl:attribute name="href"><xsl:value-of select="concat($paramPersonurl,substring-after(@nymRef,'#'))"/></xsl:attribute>
<xsl:apply-templates select="node() except $nested" />
</xsl:element>
<xsl:apply-templates select="$nested" />
</xsl:template>
<xsl:template match="tei:text//tei:placeName">
<xsl:variable name="nested" select="tei:placeName[1]|
tei:placeName[1]/following-sibling::node()" />
<xsl:element name="a">
<xsl:attribute name="href"><xsl:value-of select="concat($paramPersonurl,substring-after(@nymRef,'#'))"/></xsl:attribute>
<xsl:apply-templates select="node() except $nested" />
</xsl:element>
<xsl:apply-templates select="$nested" />
</xsl:template>
看来我应该使用 [node()[name() != 'persName']]
之类的方法将另一个命名实体排除在 <xsl:apply-templates select="node() except $nested" />
或 <xsl:apply-templates select="$nested" />
中,但我没有成功。
提前致谢。
添加模板
<xsl:template match="tei:persName/tei:placeName | tei:placeName/tei:persName">
<xsl:apply-templates/>
</xsl:template>