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

时间:2015-02-01 18:55:26

标签: xml xslt

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

以下XML文件必须转换为表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>

我希望相同的代码可以应用于具有不同名称但具有相似点要素的其他节点。您的建议将受到极大的赞赏。

卡雷尔

1 个答案:

答案 0 :(得分:7)

写一个模板

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

确保其余部分未被更改。