更改属性值,但仅限于子元素满足条件

时间:2015-11-11 12:26:45

标签: xml xslt-2.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>

我现在想要从&#34; medium&#34;更改level元素的属性值。到&#34;降低&#34;,但仅当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>

更改所有<level>元素的属性值,无论它们包含多少单词。我试图在模板匹配定义之后插入<xsl:if test ...>,以便识别<level type="medium">内容中的任何空格,但无济于事。那么这样做的正确方法是什么?

1 个答案:

答案 0 :(得分: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在线。