gpt4 book ai didi

xml - 使用XSLT重命名XML节点的所有子节点

转载 作者:行者123 更新时间:2023-12-03 17:09:33 25 4
gpt4 key购买 nike

我有一个具有以下结构的XML文件。

<Telefon>
<area>0123</area>
<number>456</number>
<extension>789</extension>
</Telefon>
<Fax>
<area>3210</area>
<number>654</number>
<extension>1098</extension>
</Fax>


我想使用XSLT将其转换为以下内容

<telefon-area>0123</area>
<telefon-number>456</number>
<telefon-extension>789</extension>
<fax-area>3210</area>
<fax-number>654</number>
<fax-extension>1098</extension>


我可以使用复制模板,尽管我可以编写模板来手动更改这些字段,但我只想编写一个在前面的Telefon和Fax节点的每个子节点上添加telefon-或Fax-前缀。

到目前为止,这是我想到的结构:

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

<!--The next template removes the telefon tag but I do not know how to modify the child nodes to extend them with the telefon- prefix.-->
<xsl:template match="Telefon">
<xsl:apply-templates select="@*|node()"/>
</xsl:template>


谢谢您的帮助!

最佳答案

要匹配Telefon节点的子代,可以执行此操作...

<xsl:template match="Telefon/*">


您也可以像这样扩展它来处理 Fax

 <xsl:template match="Telefon/*|Fax/*">


在其中,您可以将 xsl:elementlocal-name()一起使用以创建新的元素名称。

试试这个XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml" indent="yes" />

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

<!--The next template removes the telefon tag but I do not know how to modify the child nodes to extend them with the telefon- prefix.-->
<xsl:template match="Telefon|Fax">
<xsl:apply-templates />
</xsl:template>

<xsl:template match="Telefon/*|Fax/*">
<xsl:element name="{local-name(..)}-{local-name()}">
<xsl:apply-templates select="@*|node()" />
</xsl:element>
</xsl:template>
</xsl:stylesheet>


注意,在匹配 Telefon的模板中,您实际上只需要执行 <xsl:apply-templates />,因为您可能想忽略 Telefon上的任何属性(如果有)。

另外,如果除了 TelefonFax之外,如果还有其他元素,也可以使用“模式”

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml" indent="yes" />

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

<!--The next template removes the telefon tag but I do not know how to modify the child nodes to extend them with the telefon- prefix.-->
<xsl:template match="Telefon|Fax">
<xsl:apply-templates mode="child" />
</xsl:template>

<xsl:template match="*" mode="child">
<xsl:element name="{local-name(..)}-{local-name()}">
<xsl:apply-templates select="@*|node()" />
</xsl:element>
</xsl:template>
</xsl:stylesheet>


请注意,这并不会使名称全部变为小写。如果需要的话,这取决于您使用的是XSLT 2.0还是XSLT 1.0。

理想情况下,您可以使用XSLT 2.0,并执行此操作...

 <xsl:element name="{lower-case(local-name(..))}-{local-name()}">

关于xml - 使用XSLT重命名XML节点的所有子节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50625711/

25 4 0
文章推荐: javascript - 如何使用 Jest 和 vue-cli 更新快照
文章推荐: xml - 如何使用 xslt 在特定 xml 上运行 xpath
文章推荐: selenium - 如何通过 Selenium 和 WebDriver 从
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com