XSLT 如何更改节点名称的一部分?

How can XSLT change a part of a node name?

我想创建一个 XSLT,它将通过将名称中的点转换为下划线来更改 XML 文件中所有元素的名称。有很多关于更改元素全名的信息,但没有关于替换部分名称的信息。我应该如何设置我的 XSLT?

必须将以下 XML 文件转换为 table tblPerson:

<?xml version="1.0"?>
<DB>
   <person>
      <person.id id="P000072">
      <person.last_name>Drukker</person.last_name>
      <person.first_name>Bernard</person.first_name>
      <person.d_birth>1910-01-01</person.d_birth>
      <person.place_birth>Amsterdam</person.place_birth>
      <person.d_death>1992-12-13</person.d_death>
      <person.place_death>Velp</person.place_death>
   </person>
</DB>

接下来展示转换的输出应该是什么样子。点“.”必须转换为下划线“_”。

<?xml version="1.0"?>
<DB>
  <tblPerson>
  <person_id>P000072</person_id>
  <person_last_name>Drukker</person_last_name>
  <person_first_name>Bernard</person_first_name>
  <person_d_birth>1910-01-01</person_d_birth>
  <person_place_birth>Amsterdam</person_place_birth>
  <person_d_death>1992-12-13</person_d_death>
  <person_place_death>Velp</person_place_death>
  </tblPerson>
</DB>

我希望相同的代码可以应用于名称不同但点特征相似的其他节点。您的建议将不胜感激。

卡雷尔

编写模板

<xsl:template match="*[contains(local-name(), '.')]">
  <xsl:element name="{translate(local-name(), '.', '_')}" namespace="{namespace-uri()}">
    <xsl:apply-templates select="@* | node()"/>
  </xsl:element>
</xsl:template>

其中操作名称,然后使用模板

<xsl:template match="person"><tblPerson><xsl:apply-templates/></tblPerson></xsl:template>

更改 person 元素的名称,然后添加身份转换模板

<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>

确保其余部分原样复制。