部分重命名XML节点

时间:2018-04-18 11:30:47

标签: xslt

给出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_”前缀。

2 个答案:

答案 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>