查找各种其他属性值

时间:2016-03-19 23:54:25

标签: xml xslt attributes

我有这个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元素的值,或者不是”

我希望自己足够清楚,

感谢您的回答!

2 个答案:

答案 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返回一系列匹配位置,在您的情况下,它们将是一个元素,如果匹配,或者为空序列