我想创建一个 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/