xslt - xsl:当两个节点相等时,显示第一个节点的子节点
问题描述
我正在使用 XML 编辑器 19.1、Saxon PE 9.7。
对于每个选定div
的 ,我希望在graphic/@url
每个<surface>
if surface/@xml:id
=之后显示一个div/@facs
。
XSL
<xsl:for-each select="descendant-or-self::div3[@type='col']/div4[@n]">
<xsl:variable name="div4tablet" select="@facs"/>
<xsl:choose>
<xsl:when test="translate(.[@n]/$div4tablet, '#', '') = preceding::facsimile/surfaceGrp[@type='tablet']/surface[@n]/@xml:id">
<xsl:value-of select=""/> <!-- DISPLAY graphic/@url that follows facsimile/surfaceGrp/surface -->
</xsl:when>
<xsl:otherwise/>
</xsl:choose>
[....]
</xsl:for-each>
TEI
例子
<facsimile>
<surfaceGrp n="1" type="tablet">
<surface n="1.1" xml:id="ktu1-2_i_1_to_10_img">
<graphic url="../img/KTU-1-2-1-10-recto.jpg"/>
<zone xml:id=""/>
<zone xml:id=""/>
</surface>
<surface n="1.2" xml:id="ktu1-2_i_10_to_30_img">
<graphic url="../img/KTU-1-2-10-30-recto.jpg"/>
<zone xml:id=""/>
</surface>
[...]
</surfaceGrp>
<surfaceGrp n="2">
[...]
</surfaceGrp>
</facsimile>
<text>
[...]
<div3 type="col">
<div4 n="1.2.1-10" xml:id="ktu1-2_i_1_to_10" facs="#ktu1-2_i_1_to_10_img">
[...]
</div4>
<div4 n="1.2.10-30" xml:id="ktu1-2_i_10_to_30" facs="#ktu1-2_i_10_to_30_img">
[...]
</div4>
</div3>
</text>
我试过<xsl:value-of select="preceding::facsimile/surfaceGrp[@type='tablet']/surface[@n, @xml:id]/graphic/@url"/>
了,但它显示了所有graphic/@url
,而不仅仅是下面的一个fascsimile/surfaceGrp/surface
。所以我的问题是:如何只显示surface/graphic/@url
每个div3[@type='col']/div4[@n]
?
在此先感谢您的帮助。
解决方案
你应该使用xsl:key
这种类型的问题。
首先,我们必须为目标节点声明一个键
<xsl:key name="kSurface" match="surface" use="concat('#', @xml:id)"/>
注意concat
这里使用的函数,一个 # 被添加到 xml:id 以便键显示为:
#ktu1-2_i_1_to_10_img
#ktu1-2_i_10_to_30_img
现在在这个循环中:
<xsl:for-each select="descendant-or-self::div3[@type='col']/div4[@n]">
我们可以通过以下方式访问与@facs
属性匹配的键:
<xsl:value-of select="key('kSurface', @facs)/graphic/@url"/>
整个样式表如下:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="1.0">
<xsl:output omit-xml-declaration="yes"/>
<xsl:key name="kSurface" match="surface" use="concat('#', @xml:id)"/>
<xsl:template match="/">
<xsl:for-each select="descendant-or-self::div3[@type='col']/div4[@n]">
<xsl:value-of select="key('kSurface', @facs)/graphic/@url"/>
<xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
在这里看到它的作用。
推荐阅读
- android - Flutter) 应用程序在热重载之前不会释放
- ldap - 使用 DSE 6.x 运行 sstabledowngrade 时出错
- python - 日期时间天数差异按月和年分组
- java - 客户端如何使用 EC2 连接到服务器
- r - 在 R 中生成具有核密度估计值的随机点
- javascript - 使用 Javascript 将所选项目移动到列表框顶部
- c# - 在 .NET Framework 应用程序中使用 WCF
- docker - AWS lambda 容器未选择系统依赖项
- awk - 过去 1 分钟的 PHP 日志
- flutter - 使用复选框 Flutter 更改另一个小部件