Xslt 部分重命名XML节点

Xslt 部分重命名XML节点,xslt,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">

给定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>

对于所有定义元素。因此,我只想删除信息集中所有定义元素名称属性的“起始”前缀。

您可以使用:

<xsl:template match="@*[starts-with(., 'starting_')]">
    <xsl:attribute name="{name()}" select="replace(., 'starting_', '')"/>
</xsl:template>


它将所有属性start与
“starting”
匹配,并将其从XML中的输出中删除。该属性称为
name
,其值为
starting\u xxxx
,因此要匹配它,您需要执行以下操作

<xsl:template match="@name[starts-with(., 'starting_')]">
例如,您的模板可能如下所示

<xsl:template match="@name[starts-with(., 'starting_')]">
  <xsl:attribute name="name">
    <xsl:value-of select="substring(., 10)"/>
  </xsl:attribute>
</xsl:template>

@start.*
在匹配表达式中实际上不是有效的语法。此外,在XML中,该属性被称为
name
,其值为
start\u limits
,而不是
start\u limits=“…”形式的属性。您确实要重命名该属性,还是只更改其值?如果你在这里展示你所期望的输出,这会有所帮助。谢谢我想重命名该属性。我可以看到如何完全做到这一点,但我只想删除第一部分并保留下划线后的字符。谢谢,但我想编辑属性本身,而不是父节点的文本。@Qeebrato,我已经编辑了我的答案,您还可以查看更多描述的TimC答案。
<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>
<xsl:template match="@*[starts-with(., 'starting_')]">
  <xsl:attribute name="{name()}">
    <xsl:value-of select="substring(., 10)"/>
  </xsl:attribute>
</xsl:template>