gpt4 book ai didi

c++ - 如何将 XML 文件拆分为多个 XML,以便每个新文件仅包含原始文件中的一个文本节点?

转载 作者:行者123 更新时间:2023-11-30 04:25:26 25 4
gpt4 key购买 nike

我有一个看起来像这样的 XML(任意 XML 输入)

<NodeLevel1>
<NodeLevel2>
<NodeLevel3>
Sample text 1
</NodeLevel3>
</NodeLevel2>

<NodeLevel2>
.
.
.
... <NodeLevelN>
Some deep thought
</NodeLevelN>
</NodeLevel2>

<NodeLevel2>
Sample text 2
</NodeLevel2>
Sample text 3
</NodeLevel1>


在 XSLT 转换之后我想要的是 4 个新的 XML,只包含一个文本节点,如下 4 个 XML:

1.

    <NodeLevel1>
<NodeLevel2>
<NodeLevel3>
Sample text 1
</NodeLevel3>
</NodeLevel2>
</NodeLevel1>

2.

    <NodeLevel1>    
<NodeLevel2>
.
.
.
... <NodeLevelN>
Some deep thought
</NodeLevelN>
</NodeLevel2>
</NodeLevel1>

3.

    <NodeLevel1>
<NodeLevel2>
Sample text 2
</NodeLevel2>
</NodeLevel1>

4.

    <NodeLevel1>
Sample text 3
</NodeLevel1>

最好的方法是什么?我正在使用 C++(我可以使用 libxml2 和 libxslt)谢谢!

最佳答案

我会将 XSLT 2.0 与 xsl:result-document 一起使用,或者在您使用 libxslt 的情况下,您还可以使用 exsl:document 扩展元素:

<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0"
xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="exsl"
exclude-result-prefixes="exsl">

<xsl:template match="/">
<xsl:apply-templates select="NodeLevel1/node()[self::* or self::text()[normalize-space()]]" mode="new-doc"/>
</xsl:template>

<xsl:template match="NodeLevel1/node()" mode="new-doc">
<exsl:document href="result{position()}.xml">
<NodeLevel1>
<xsl:copy-of select="."/>
</NodeLevel1>
</exsl:document>
</xsl:template>

</xsl:stylesheet>

进一步思考这个问题,我改进了样式表以处理任何类型的根元素:

<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0"
xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="exsl"
exclude-result-prefixes="exsl">

<xsl:template match="/">
<xsl:apply-templates select="*/node()[self::* or self::text()[normalize-space()]]" mode="new-doc"/>
</xsl:template>

<xsl:template match="/*/node()" mode="new-doc">
<exsl:document href="result{position()}.xml">
<xsl:element name="{name(..)}" namespace="{namespace-uri(..)}">
<xsl:copy-of select="."/>
</xsl:element>
</exsl:document>
</xsl:template>

</xsl:stylesheet>

[编辑]如果您想使用像 Saxon 或 AltovaXML 或 XmlPrime 这样的 XSLT 2.0 处理器,这里有一个 XSLT 2.0 样式表:

<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">

<xsl:template match="/">
<xsl:apply-templates select="*/(* | text()[normalize-space()])" mode="new-doc"/>
</xsl:template>

<xsl:template match="/*/node()" mode="new-doc">
<xsl:result-document href="result{position()}.xml">
<xsl:element name="{name(..)}" namespace="{namespace-uri(..)}">
<xsl:copy-of select="."/>
</xsl:element>
</xsl:result-document>
</xsl:template>

</xsl:stylesheet>

关于c++ - 如何将 XML 文件拆分为多个 XML,以便每个新文件仅包含原始文件中的一个文本节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12140443/

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