我有这个XML节点:
<app type="ponctuation">
<lem wit="A B C"> ¶ </lem>
<rdg wit="D E"/>
</app>
如果wit属性的值之一是A(或B或C),我想显示<lem>
元素的值。我的XSL不起作用:
<xsl:template match="tei:app">
<xsl:if test="@type = 'ponctuation'">
<xsl:if test="./tei:lem[@wit = 'A']">
<xsl:value-of select="./tei:lem[@wit = 'A']"/>
</xsl:if>
</xsl:if>
</xsl:template>
或者,更确切地说,如果wit属性的值是搜索的值,则它可以工作。
所以我想我的问题是:我怎么说处理器“如果它自己的属性值包含”A“,那么提取lem元素的值,或者不是”
我希望自己足够清楚,
感谢您的回答!
答案 0 :(得分:2)
此任务类似于finding element by CSS class using XPath的任务,因此您可以在此处使用类似的方法。基本上,您需要使用空格填充属性值,并使用contains()
检查匹配项:
tei:lem[contains(concat(' ', @wit, ' '), ' A ')]
以上内容可以在模板中使用,如下所示:
<xsl:template match="tei:app">
<xsl:variable name="lem" select="tei:lem[contains(concat(' ', @wit, ' '), ' A ')]"/>
<xsl:if test="@type='ponctuation' and $lem">
<xsl:value-of select="$lem"/>
</xsl:if>
</xsl:template>
答案 1 :(得分:0)
这是一种替代方法,它不依赖于追加前导和尾随空白,假设您可以使用XSLT 2.0
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="app[@type='ponctuation']">
<xsl:apply-templates select="lem[count(index-of(tokenize(@wit,' '),'A')) gt 0]"/>
</xsl:template>
<xsl:template match="lem">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
这会将属性值标记为一系列字符串,然后使用index-of
返回一系列匹配位置,在您的情况下,它们将是一个元素,如果匹配,或者为空序列