XSL 2.0 - 从嵌套元素生成不同的 url
XSL 2.0 - generating distinct urls from nested elements
我有 tei-xml 文件,我在其中标记了中世纪文档中的命名实体,特别是使用 <persName/>
的人名。一个简单的例子:
<persName nymref="#Bernard_Faure_Senior">Bernardus Fabri senior</persName>
不过,稿件中经常有名字需要我标注"Raimunda uxor Bernardi Fabri"(即"Raimunda, wife of Bernard Faure")。在这里,我以嵌套方式标记了两个名称:
<persName nymref="#Raimunda_Faure">Raimunda uxor
<persName nymref="#Bernard_Faure_Senior">Bernardi Fabri
senior</persName></persName>
一般来说这不是查询数据的问题。但是,我想通过 XSLT 2.0 为网页输出以下内容,其中每个名称都变成 URL 指向该人自己的网页(使用 @nymRef
)。以上应该输出为:
<a href="www.foo.com/person/Raimunda_Faure">Raimunda
uxor</a><a href="www.foo.com/person/Bernard_Faure_Senior">Bernardi
Fabri<a>
(即...etiam nec tortor erat Raimunda uxor Bernardi Fabri est leo cursus magna, maximus finibus...)
此外,有时会出现以下情况(两个名字嵌套在一起):
<persName nymref="#Raimunda_Faure">Raimunda uxor
<persName nymref="#Bernard_Faure_Senior">Bernardi Fabri
senior</persName> matris
<persName nymRef="Bernard_Faure_Junior">Bernardi
junior</persName></persName>
(虽然从来没有<persName>
嵌套三层的情况)
我完全不知道如何递归区分和处理 //persName[x]
和 //persname[x]//persName[x]
以使它们分开 URL。
url 是从静态值 + after-substring(//tei:persName/@nymRef,'#')
生成的。很明显一个简单的XSL语句returns一个基数错误:
concat('www.foo.com/person',after-substring(//tei:persName/@nymRef,'#'))
非常感谢您的帮助。
假设您的 XML 看起来像这样...
<persName nymref="#Raimunda_Faure">Raimunda uxor
<persName nymref="#Bernard_Faure_Senior">Bernardi Fabri senior</persName> matris
<persName nymRef="Bernard_Faure_Junior">Bernardi junior</persName>
</persName>
然后您可以通过将此模板添加到您的 XSLT 来实现您的目标
<xsl:template match="persName">
<a href="www.foo.com/person/{substring-after(@nymref, '#')}">
<xsl:value-of select="text()[1]" />
</a>
<xsl:apply-templates select="node()[position() > 1]" />
</xsl:template>
(尽管如果您要处理 TEI,则需要考虑命名空间)。
这确实假设名称中没有其他类型的标签。
编辑:如果名称中还有其他标签,请尝试使用此模板,它将在 a
标签
中的第一个 persName
之前包装所有内容
<xsl:template match="persName">
<xsl:variable name="nested" select="persName[1]|persName[1]/following-sibling::node()" />
<a href="www.foo.com/person/{substring(@nymref, 2)}">
<xsl:apply-templates select="node() except $nested" />
</a>
<xsl:apply-templates select="$nested" />
</xsl:template>
我有 tei-xml 文件,我在其中标记了中世纪文档中的命名实体,特别是使用 <persName/>
的人名。一个简单的例子:
<persName nymref="#Bernard_Faure_Senior">Bernardus Fabri senior</persName>
不过,稿件中经常有名字需要我标注"Raimunda uxor Bernardi Fabri"(即"Raimunda, wife of Bernard Faure")。在这里,我以嵌套方式标记了两个名称:
<persName nymref="#Raimunda_Faure">Raimunda uxor
<persName nymref="#Bernard_Faure_Senior">Bernardi Fabri
senior</persName></persName>
一般来说这不是查询数据的问题。但是,我想通过 XSLT 2.0 为网页输出以下内容,其中每个名称都变成 URL 指向该人自己的网页(使用 @nymRef
)。以上应该输出为:
<a href="www.foo.com/person/Raimunda_Faure">Raimunda
uxor</a><a href="www.foo.com/person/Bernard_Faure_Senior">Bernardi
Fabri<a>
(即...etiam nec tortor erat Raimunda uxor Bernardi Fabri est leo cursus magna, maximus finibus...)
此外,有时会出现以下情况(两个名字嵌套在一起):
<persName nymref="#Raimunda_Faure">Raimunda uxor
<persName nymref="#Bernard_Faure_Senior">Bernardi Fabri
senior</persName> matris
<persName nymRef="Bernard_Faure_Junior">Bernardi
junior</persName></persName>
(虽然从来没有<persName>
嵌套三层的情况)
我完全不知道如何递归区分和处理 //persName[x]
和 //persname[x]//persName[x]
以使它们分开 URL。
url 是从静态值 + after-substring(//tei:persName/@nymRef,'#')
生成的。很明显一个简单的XSL语句returns一个基数错误:
concat('www.foo.com/person',after-substring(//tei:persName/@nymRef,'#'))
非常感谢您的帮助。
假设您的 XML 看起来像这样...
<persName nymref="#Raimunda_Faure">Raimunda uxor
<persName nymref="#Bernard_Faure_Senior">Bernardi Fabri senior</persName> matris
<persName nymRef="Bernard_Faure_Junior">Bernardi junior</persName>
</persName>
然后您可以通过将此模板添加到您的 XSLT 来实现您的目标
<xsl:template match="persName">
<a href="www.foo.com/person/{substring-after(@nymref, '#')}">
<xsl:value-of select="text()[1]" />
</a>
<xsl:apply-templates select="node()[position() > 1]" />
</xsl:template>
(尽管如果您要处理 TEI,则需要考虑命名空间)。
这确实假设名称中没有其他类型的标签。
编辑:如果名称中还有其他标签,请尝试使用此模板,它将在 a
标签
persName
之前包装所有内容
<xsl:template match="persName">
<xsl:variable name="nested" select="persName[1]|persName[1]/following-sibling::node()" />
<a href="www.foo.com/person/{substring(@nymref, 2)}">
<xsl:apply-templates select="node() except $nested" />
</a>
<xsl:apply-templates select="$nested" />
</xsl:template>