gpt4 book ai didi

xml - 使用 XSL 从一个节点移动到另一个节点

转载 作者:数据小太阳 更新时间:2023-10-29 01:56:48 26 4
gpt4 key购买 nike

所以我想使用 XSL 转换以下内容

<doc>
<data id="priority" level="2" include="true">
<name>Priority</name>
</data>
<data id="cost" level="1" leveltype="number">
<name>Cost</name>
</data>
<data id="date" level="3" include="true">
<name>Date</name>
</data>
</doc>

为此

<doc>
<data id="priority">
<name>Priority</name>
</data>
<data id="cost">
<name>Cost</name>
</data>
<data id="date">
<name>Date</name>
</data>

<!-- ordering matters, though if necessary I can reorder this manually via the DOM instead of XSL -->
<levels>
<level id="cost" include="false" type="number"/>
<level id="priority" include="true"/>
<level id="date" include="true"/>
</level>
</doc>

基本上我想获取关卡属性并将它们变成自己的东西。如果有某种方法可以删除级别编号并使用节点的顺序来表示它,那将是一个巨大的好处。

最佳答案

这是一个更短更简单的解决方案,只使用模板(没有 <xsl:for-each> ):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>

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

<xsl:template match="/*">
<doc>
<xsl:apply-templates select="*"/>
<levels>
<xsl:apply-templates select="data" mode="level">
<xsl:sort select="@level" data-type="number"/>
</xsl:apply-templates>
</levels>
</doc>
</xsl:template>
<xsl:template match="data/@*[not(name()='id')]"/>

<xsl:template match="data" mode="level">
<level id="{@id}" include="{boolean(@include)}">
<xsl:if test="@leveltype">
<xsl:attribute name="type"><xsl:value-of select="@leveltype"/></xsl:attribute>
</xsl:if>
</level>
</xsl:template>
</xsl:stylesheet>

应用于提供的 XML 文档时:

<doc>
<data id="priority" level="2" include="true">
<name>Priority</name>
</data>
<data id="cost" level="1" leveltype="number">
<name>Cost</name>
</data>
<data id="date" level="3" include="true">
<name>Date</name>
</data>
</doc>

产生了想要的、正确的结果:

<doc>
<data id="priority">
<name>Priority</name>
</data>
<data id="cost">
<name>Cost</name>
</data>
<data id="date">
<name>Date</name>
</data>
<levels>
<level id="cost" include="false" type="number"/>
<level id="priority" include="true"/>
<level id="date" include="true"/>
</levels>
</doc>

解释:

  1. 使用和覆盖身份规则/模板。

  2. 使用 mode="level"生成结果文档的第二部分。

关于xml - 使用 XSL 从一个节点移动到另一个节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6022162/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com