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

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

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

卡雷尔

最佳答案

编写模板

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

确保其余部分原样复制。

关于xml - XSLT 如何更改节点名称的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28266477/

相关文章:

c# - 基于模板的 XML 到 CSV 转换

java - 为什么 qName 起作用而 LocalName 不起作用?

python-pdfkit (wkhtmltopdf) 目录溢出

winapi - MSXML:如何以编程方式获取失败转换的错误文本?

xml - XSLT - "/."有什么作用?

objective-c - GDataXML、命名空间和 xpath

java - 我对 XPath 做错了什么?

android - 可以在Android Action Bar中通过xml设置ActionViewClass的属性吗?

xml - XSD : How to use ENTITY in XSD

regex - 按其他节点值的模式分组的节点值求和