给出XML片段:
<rng:define name="starting_limits">
<rng:element name="limits">
<rng:ref name="Limits"/>
</rng:element>
</rng:define>
我想要这个:
<rng:define name="limits">
<rng:element name="limits">
<rng:ref name="Limits"/>
</rng:element>
</rng:define>
适用于所有定义元素。所以我只想删除信息集中所有定义元素名称属性的“starting_”前缀。
答案 0 :(得分:2)
你可以用这个:
<xsl:template match="@*[starts-with(., 'starting_')]">
<xsl:attribute name="{name()}" select="replace(., 'starting_', '')"/>
</xsl:template>
它匹配所有属性start-with 'starting_'
并将其从输出
答案 1 :(得分:2)
在您的XML中,该属性名为name
,其值为starting_xxxx
,因此为了匹配它,您可以这样做...
<xsl:template match="@name[starts-with(., 'starting_')]">
或许这可能是在XSLT 2.0及以上版本中
<xsl:template match="@name[matches(., 'starting_.*')]">
要删除starting_attribute
,您可以执行以下操作之一,例如
<xsl:value-of select="substring-after(., 'starting_')"/>
<xsl:value-of select="substring(., 10)"/>
因此,例如,您的模板可能如下所示
<xsl:template match="@name[starts-with(., 'starting_')]">
<xsl:attribute name="name">
<xsl:value-of select="substring(., 10)"/>
</xsl:attribute>
</xsl:template>
如果您想让它更通用,并且匹配任何属性,而不仅仅是一个名为name
的属性,您可以将其更改为此
<xsl:template match="@*[starts-with(., 'starting_')]">
<xsl:attribute name="{name()}">
<xsl:value-of select="substring(., 10)"/>
</xsl:attribute>
</xsl:template>