XSL转换仅针对基于属性的某些元素

时间:2013-05-07 12:36:19

标签: xslt

我有一个XML文件,应该仅根据其属性值为某些元素应用转换规则,其余部分应保留原样。

<bigdata>
<data>
    <Object class="QWE" Name="Country-1/State-1/QWE-1">
        <p name="Map">20</p>
        <p name="Required">0</p>
        <p name="Combined">68</p>
        <p name="State">0</p>
    </Object>
    <Object class="RTY" Name="Country-1/State-1/RTY-1">
        <p name="Map">20</p>
        <p name="Required">0</p>
        <p name="Combined">68</p>
        <p name="State">0</p>
    </Object>
    <Object class="UIO" Name="Country-1/State-1/UIO-1">
        <p name="Map">20</p>
        <p name="Required">0</p>
        <p name="Combined">68</p>
        <p name="State">0</p>
    </Object>
    <Object class="PAS" Name="Country-1/State-1/PAS-1">
        <p name="Map">20</p>
        <p name="Required">0</p>
        <p name="Combined">68</p>
        <p name="State">0</p>
    </Object>
</data>

上面的xml应该转换为xml片段,其中只有 class 等于QWE的xml元素 Object 应该更改为 POST 。 即只有第一个元素必须根据其属性进行更改。 对此的任何建议都将是非常感激的

    <bigdata>
<data>
    <Object class="POST" Name="Country-1/State-1/POST-1">
        <p name="Map">20</p>
        <p name="Required">0</p>
        <p name="Combined">68</p>
        <p name="State">0</p>
    </Object>
    <Object class="RTY" Name="Country-1/State-1/RTY-1">
        <p name="Map">20</p>
        <p name="Required">0</p>
        <p name="Combined">68</p>
        <p name="State">0</p>
    </Object>
    <Object class="UIO" Name="Country-1/State-1/UIO-1">
        <p name="Map">20</p>
        <p name="Required">0</p>
        <p name="Combined">68</p>
        <p name="State">0</p>
    </Object>
    <Object class="PAS" Name="Country-1/State-1/PAS-1">
        <p name="Map">20</p>
        <p name="Required">0</p>
        <p name="Combined">68</p>
        <p name="State">0</p>
    </Object>
</data>

2 个答案:

答案 0 :(得分:1)

试试这个:

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

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

    <xsl:template match="Object/@class[. = 'QWE' ]">
            <xsl:attribute name="class">
                <xsl:value-of select="'POST'"/>
            </xsl:attribute>
    </xsl:template>

</xsl:stylesheet>

将生成以下输出:

<bigdata>
        <data>
                <Object class="POST" Name="Country-1/State-1/QWE-1">
                        <p name="Map">20</p>
                        <p name="Required">0</p>
                        <p name="Combined">68</p>
                        <p name="State">0</p>
                </Object>
                <Object class="RTY" Name="Country-1/State-1/RTY-1">
                        <p name="Map">20</p>
                        <p name="Required">0</p>
                        <p name="Combined">68</p>
                        <p name="State">0</p>
                </Object>
                <Object class="UIO" Name="Country-1/State-1/UIO-1">
                        <p name="Map">20</p>
                        <p name="Required">0</p>
                        <p name="Combined">68</p>
                        <p name="State">0</p>
                </Object>
                <Object class="PAS" Name="Country-1/State-1/PAS-1">
                        <p name="Map">20</p>
                        <p name="Required">0</p>
                        <p name="Combined">68</p>
                        <p name="State">0</p>
                </Object>
        </data>
</bigdata>

如果类值应以字符串(QWE)开头并且只应替换此部分,则更新。试试这个:

<xsl:template match="Object/@class[starts-with(., 'QWE') ]">
    <xsl:attribute name="class">
        <xsl:value-of select="'POST'"/>
        <xsl:value-of select="substring-after(.,'QWE')"/>
    </xsl:attribute>
</xsl:template>

答案 1 :(得分:0)

使用以下XSLT转换上面的xml:

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="@class[parent::Object]">
    <xsl:choose>
      <xsl:when test=".='QWE'">
        <xsl:attribute name="class">
          <xsl:value-of select="'POST'"/>
        </xsl:attribute>
      </xsl:when>
      <xsl:otherwise>
        <xsl:attribute name="class">
          <xsl:value-of select="."/>
        </xsl:attribute>
      </xsl:otherwise>
    </xsl:choose>

  </xsl:template>

请参阅以获取更多信息:

XSLT: How to change an attribute value during <xsl:copy>?