在XSLT 1.0中的属性值之间插入文本

时间:2013-07-23 08:29:08

标签: xslt xslt-1.0

我有一个像下面这样的xml:

<?xml version="1.0" encoding="UTF-8"?>
<data>
<mObject distName="ABC-1/Schedule-New/ScheduleItem-2002" class="PM">
<p name="Active">1</p>
</managedObject>
<mObject distName="ABC-2/Schedule-New/ScheduleItem-2002" class="PM">
<p name="Active">1</p>
</managedObject>
</data>

现在我必须在 mObject attibute distName 中插入文字“XYZ-1”,如下所示

<?xml version="1.0" encoding="UTF-8"?>
<data>
<mObject distName="ABC-1/XYZ-1/Schedule-New/ScheduleItem-2002" class="PM">
<p name="Active">1</p>
</managedObject>
<mObject distName="ABC-2/XYZ-1/Schedule-New/ScheduleItem-2002" class="PM">
<p name="Active">1</p>
</managedObject>
</data>

我可以使用以下方式实现这一目标:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output encoding="UTF-8" indent="yes" method="xml" omit-xml-declaration="no" doctype-system="raml21.dtd" />
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>
<xsl:template match="mObject[@class = 'PM' ]">
    <xsl:copy>
        <xsl:apply-templates select="@*"/>
        <xsl:attribute name="distName">
            <xsl:value-of select="concat(substring-before( @distName,'Schedule-' ), 'XYZ-1/', substring-after( @distName, '/'))"/>
        </xsl:attribute>
        <xsl:apply-templates select="node()"/>
    </xsl:copy>
</xsl:template>
</xsl:stylesheet>

但这里几乎没有问题:

  1. 这如何保证XYZ-1文本的插入始终在distName属性中第一次出现“/”后发生?

  2. 我希望插入仅在首次出现“/”后才会发生。

  3. 任何想法或建议????

1 个答案:

答案 0 :(得分:2)

让我觉得你想要

concat(substring-before( @distName,'/' ), '/XYZ-1/', substring-after( @distName, '/'))