XSLT将一个特定的XML元素放在所有其他元素之前



XSLT 1.0解决方案是必需的。我的问题类似于XSLTChange元素顺序,如果必须的话,我会接受这个答案,但我希望我能做一些类似于"把this_element放在第一位,并保留所有其他元素的原始顺序"的事情。输入是这样的,其中...可以是任何一组简单的元素或文本节点,但没有处理指令或注释。另请参见下文。

<someXML>  
<recordList>  
<record priref="1" created="2009-06-04T16:54:35" modification="2014-12-16T14:56:51" selected="False">  
...
<collection_type>3D</collection_type>  
...  
<object_category>headgear</object_category>  
<object_name>hat</object_name>  
<object_number>060998</object_number>  
...  
</record>  
<record priref="3" created="2009-06-04T11:54:35" modification="2020-08-05T18:24:33" selected="False">  
...
<collection_type>3D</collection_type>  
<description>a very elaborate coat</description>  
<object_category>clothing</object_category>  
<object_name>coat</object_name>  
<object_number>060998</object_number>  
</record>
</recordList>
</someXML>

这将是所需的输出。

<someXML>  
<recordList>  
<record priref="1" created="2009-06-04T16:54:35" modification="2014-12-16T14:56:51" selected="False">  
<object_category>clothing</object_category>  
...
<collection_type>3D</collection_type>  
...  
<object_name>hat</object_name>  
<object_number>060998</object_number>  
...  
</record>  
<record priref="3" created="2009-06-04T11:54:35" modification="2020-08-05T18:24:33" selected="False">   
<object_category>clothing</object_category>  
...
<collection_type>3D</collection_type>  
<description>a very elaborate coat</description>  
<object_name>coat</object_name>  
<object_number>060998</object_number>  
</record>
</recordList>
</someXML>

如果先放object_category,然后在记录中再次出现,也就是按原始顺序放在标记中,这可能是可以的。

我将添加一些背景。这个API生成了大约900.000个XML记录,每个记录按字母顺序具有不同的标记(元素名称(。大约有170个不同的元素名称(这就是为什么我不想单独列出它们,除非没有其他方法(。XML被引入到这个图形数据库中。这需要时间,但如果我们将object_category视为记录中的第一个元素,则可能会加快速度。

编辑:我们可以配置API,但不能配置API后面的C#代码。我们一步一步地浏览数据库,一步一个脚印地获取大约100条记录。如果我们不指定其他内容,我们将得到上面示例的XML。我们还可以指定一个XSL表来转换XML。这就是我们在这里想要做的。

这个例子不明确,因为我们不知道所有这些...占位符代表什么。我想这应该对你有用:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="record">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select="object_category"/>
<xsl:apply-templates select="node()[not(self::object_category)]"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

相关内容

  • 没有找到相关文章

最新更新