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. 并将类属性值中的CENTER替换为SIDE ,并将Name属性值从 Country-1/ CENTER -1/RTY-1 替换为 Country-1/ SIDE -1/RTY-1**。
  3. 其余元素不应受到影响,应保持原样。

我尝试通过 replace-all-string 中的方法替换子字符串,但没有成功。提前致谢

输出 xml 应该像:

<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>
4

1 回答 1

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>
于 2013-05-08T17:58:51.870 回答