读取元素的属性并根据某些条件替换属性中字符串的一部分

时间:2013-05-08 17:32:11

标签: xslt xslt-1.0

我在为以下情况创建xsl转换时遇到问题:

<text>
<data>
<Object class="CENTRE" Name="Country-1/CENTRE-1/RTY-1" version="1">
    <p name="Map">20</p>
    <p name="Required">0</p>
</Object>
<Object class="LEFT" Name="Country-1/LEFT-1/RTY-1" version="1">
    <p name="Map">20</p>
    <p name="Required">0</p>
</Object>
<Object class="RIGHT" Name="Country-1/RIGHT-1/UIO-1" version="1">
    <p name="Map">20</p>
    <p name="Required">0</p>
</Object>
</data>
</text>

在上面的代码片段中,我必须:

  1. 查找哪个类属性为 CENTER
  2. 的元素
  3. 并将中心替换为类属性值中的 SIDE ,并将来自Country-1 / CENTER的名称属性值替换为子字符串 -1 / RTY-1到Country-1 / SIDE -1 / RTY-1 **。
  4. 休息元素不应受到影响,应保留原样。
  5. 我尝试通过replace-all-string中的方法替换子串,但是没有成功。 提前致谢

    OutPut xml sholud就像:

    <text>
    <data>
    <Object class="SIDE" Name="Country-1/SIDE-1/RTY-1" version="1">
    <p name="Map">20</p>
    <p name="Required">0</p>
    </Object>
    <Object class="LEFT" Name="Country-1/LEFT-1/RTY-1" version="1">
    <p name="Map">20</p>
    <p name="Required">0</p>
    </Object>
    <Object class="RIGHT" Name="Country-1/RIGHT-1/UIO-1" version="1">
    <p name="Map">20</p>
    <p name="Required">0</p>
    </Object>
    </data>
    </text>
    

1 个答案:

答案 0 :(得分:1)

试试这个:

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

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

    <xsl:template match="Object[@class = 'CENTRE' ]">
        <xsl:copy>
            <xsl:apply-templates select="@*"/>
            <xsl:attribute name="class">
                <xsl:value-of select="'SIDE'"/>
            </xsl:attribute>
            <xsl:attribute name="Name">
                <xsl:value-of select="concat(substring-before( @Name,'CENTRE' ), 'SIDE', substring-after( @Name, 'CENTRE'))"/>
            </xsl:attribute>
            <xsl:apply-templates select="node()"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

将生成以下输出:

<text>
    <data>
        <Object class="SIDE" Name="Country-1/SIDE-1/RTY-1" version="1">
            <p name="Map">20</p>
            <p name="Required">0</p>
        </Object>
        <Object class="LEFT" Name="Country-1/LEFT-1/RTY-1" version="1">
            <p name="Map">20</p>
            <p name="Required">0</p>
        </Object>
        <Object class="RIGHT" Name="Country-1/RIGHT-1/UIO-1" version="1">
            <p name="Map">20</p>
            <p name="Required">0</p>
        </Object>
    </data>
</text>