选择具有特定值的所有属性

时间:2013-12-18 14:51:48

标签: xml xslt

我有以下xml:

<file>
  <content value="Test" />
  <content value="Empty" />
</file>

我想使用转换,但在本例中我无法选择值为'Test'的属性。这是我xslt的相关部分:

<xsl:template match="@value">
  <xsl:attribute name="value">
    <xsl:text>succeeded</xsl:text>
  </xsl:attribute>
</xsl:template>

如果我尝试将匹配更改为此@value='Test'@value['Test'],则无效。我可以使用其完整路径获取元素,例如//content[@value='Test'],但我需要属性。

有没有办法根据属性值进行替换?

1 个答案:

答案 0 :(得分:1)

这是您可以根据其值选择属性的方法:

<xsl:template match="@value[.='Test']">
  <xsl:attribute name="value">
    <xsl:text>succeeded</xsl:text>
  </xsl:attribute>
</xsl:template>

此处,.表示评估属性的文本内容。

嵌入到身份转换中的完整示例(使用XML片段作为输入):

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" indent="yes"/>

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

<xsl:template match="@value[.='Test']">
 <xsl:attribute name="value">
   <xsl:text>succeeded</xsl:text>
 </xsl:attribute>
</xsl:template>

</xsl:stylesheet>

考虑到您尝试实现此目的的其他方式,从内容元素到达带/的属性,而不是尖括号:

<xsl:template match="content/@value">