2015-11-11 58 views
0

我有下面的XML更改的屬性值,但只有當子元素滿足條件

<?xml version="1.0" encoding="UTF-8"?> 
<entry> 
    <cit> 
     <level type="higher"> 
     <part>higher1</part> 
     <part>higher2</part> 
     </level> 
     <level type="medium"> 
     <content>higher1 higher2</content> 
     </level> 
    </cit> 
    <cit> 
     <level type="higher"> 
     <part>higherA</part> 
     </level> 
     <level type="medium"> 
     <content>higherA</content> 
     </level> 
    </cit> 
</entry> 

我現在想的level元素的屬性值從「中」變更爲「低」,但只如果content孩子的內容由兩個或更多單詞組成。

我的XSL文件(XSLT 2.0)

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.0"> 
    <xsl:output method="xml" indent="yes" /> 
    <xsl:strip-space elements="*" /> 

    <xsl:template match="node()|@*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node() | @*" /> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="cit/level/@type[.='medium']"> 
     <xsl:attribute name="{name()}">lower</xsl:attribute> 
    </xsl:template> 

</xsl:stylesheet> 

改變屬性值ALL <level>元素,無論他們有多少字包含的內容。我嘗試在模板匹配定義之後插入一個<xsl:if test ...>,以便識別<level type="medium">內容中的任何空格,但無濟於事。那麼,什麼纔是正確的做法呢?

回答

1

使用tokenize例如,

<xsl:template match="cit/level[tokenize(content, '\s+')[2]]/@type[.='medium']"> 
    <xsl:attribute name="{name()}">lower</xsl:attribute> 
</xsl:template> 

在線在http://xsltransform.net/ncdD7md

+0

完美!非常感謝!但是我仍然可以問一下標記大小表達式中的''[2]''完全代表什麼? – smo

+0

這是一個位置謂詞,它選擇'tokenize'返回的序列中的第二個項目,如果有第二個項目,並且與外部謂詞('level [tokenize(content,'s +')[] 2]])它是檢查標記化至少返回兩個項目的簡短形式。 –

+0

這可能與要求「包含兩個或更多單詞」的準確匹配,特別是如果存在前導空格或尾隨空格。我傾向於建議謂詞'[包含(normalize-space(),'')]'' –