2016-03-19 95 views
2

我有這樣的XML節點:查找屬性值的各種其它

<app type="ponctuation"> 
<lem wit="A B C"> ¶ </lem> 
<rdg wit="D E"/> 
</app> 

我想顯示<lem>元件的值,如果機智屬性的值中的一個是A(或B或C )。我的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> 

或者,更準確地說,它的工作原理,如果智慧屬性的值是一個搜索。

所以我想我的問題是:我怎麼到處理器說「不提取LEM元素的值,如果其自身的屬性值包含‘A’,等等與否」

我希望我做我自己清楚,

謝謝你的答案!

回答

1

此任務與finding element by CSS class using XPath的任務相似,因此您可以在此處使用類似的方法。基本上,你需要墊空間的屬性值,並使用來檢查匹配:

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> 
+0

非常感謝你,它完美的作品! – MGL

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返回一系列匹配位置,在您的情況下,它將是一個元素,如果匹配或空序列。