1

私はこのような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.1。

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

2.2。

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

3.3。

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

4.4。

    <NodeLevel1>
        Sample text 3
    </NodeLevel1>

それを行うための最良の方法は何ですか?私はC++を使用しています(libxml2とlibxsltを使用できます)ありがとう!

4

1 に答える 1

2

私はXSLT2.0xsl: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プロセッサを使用する場合は、XSLT2.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>
于 2012-08-27T11:04:27.627 に答える