0

次のような長い XML があります。

MainXML.xml:

<OpenTag>
    <SubTag>Value 1</SubTag>
    <SubTag>Value 2</SubTag>
    <SubTag>Value 3</SubTag>
    <SubTag>Value 4</SubTag>
</OpenTag>

SubTagそれは、多くのデータを含むより複雑な繰り返し構造であることを除いて。代わりにどうにかしてこれを行うことはできませんか?:

SubXML1.xml:

<SubTag>Value 1</SubTag>

SubXML2.xml:

<SubTag>Value 2</SubTag>

SubXML3.xml:

<SubTag>Value 3</SubTag>

SubXML4.xml:

<SubTag>Value 4</SubTag>

MainXML.xml:

<OpenTag>
    ... For Each XML File in the Sub-XML Folder, stick it here.
</OpenTag>

基本的な File 関数と String 関数を使用してこれを実行できることはわかっていますが、XSL/XML を使用してそれを行うためのネイティブな方法があるかどうかを知りたいと思っていました。

4

2 に答える 2

1

LINQ to XML に問題がない場合は、次の作業コードをご覧ください。

public static XDocument AggregateMultipleXmlFilesIntoASingleOne(string parentFolderPath, string fileNamePrefix)
{
    return new XDocument(
        new XElement("OpenTag", 
            Directory.GetFiles(parentFolderPath)
                .Where(file => Path.GetFileName(file).StartsWith(fileNamePrefix))
                .Select(XDocument.Load)
                .Select(doc => new XElement(doc.Root))
                .ToArray()));
}
于 2013-10-17T20:46:32.483 に答える
0

これがまさにあなたが求めているものかどうかはわかりませんが、うまくいくようです。それは XSLT 2.0 に依存しています。SubXML ファイル用のフォルダーも用意する必要があります。

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

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>    

<xsl:template match="/">
    <xsl:for-each select="//SubTag">
        <xsl:result-document href="folder/SubXML{position()}.xml" method="xml">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
            </xsl:copy>
        </xsl:result-document>
    </xsl:for-each>
    <xsl:apply-templates />
</xsl:template>

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

</xsl:stylesheet>
于 2013-10-17T21:35:09.863 に答える