QA@IT

xslxについて

4312 PV

手法がわからず悩んでいることがあります。
A1グループとB1グループの上から順にC1グループに所属させたいのですが何か良い方法はないでしょうか?
妙案があれば教えて頂けたらと思います。

<A1>
 <XX>あああ</XX>
 <XX>いいい</XX>
 <XX>ううう</XX>
</A1>
<B1>
 <XX>えええ</XX>
 <XX>おおお</XX>
</B1>



<C1>
 <X1>あああ</X1>
 <X2>えええ</X2>
</C1>
<C1>
 <X1>いいい</X1>
 <X1>おおお</X1>
</C1>
<C1>
 <X1>ううう</X1>
</C1>

回答

もう解決済みと思いますが、次のようなスタイルシートではいかがでしょうか?

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="input">
        <xsl:variable name="current" as="element()" select="."/>
        <output>
            <xsl:variable name="elementMax" as="xs:integer" select="max((count(A1/*),count(B1/*)))"/>
            <xsl:for-each select="1 to $elementMax">
                <xsl:variable name="position" as="xs:integer" select="."/>
                <C1>
                    <xsl:if test="exists($current/A1/*[$position])">
                        <xsl:element name="{concat('X',.)}">
                            <xsl:copy-of select="$current/A1/*[$position]/node()"/>
                        </xsl:element>
                    </xsl:if>
                    <xsl:if test="exists($current/B1/*[$position])">
                        <xsl:element name="{concat('X',.)}">
                            <xsl:copy-of select="$current/B1/*[$position]/node()"/>
                        </xsl:element>
                    </xsl:if>
                </C1>
            </xsl:for-each>
        </output>
    </xsl:template>
</xsl:stylesheet>

[入力データ]

<?xml version="1.0" encoding="UTF-8"?>
<input>
    <A1>
        <XX>あああ</XX>
        <XX>いいい</XX>
        <XX>ううう</XX>
    </A1>
    <B1>
        <XX>えええ</XX>
        <XX>おおお</XX>
    </B1>
</input>

[出力データ]

<?xml version="1.0" encoding="UTF-8"?>
<output>
   <C1>
      <X1>あああ</X1>
      <X1>えええ</X1>
   </C1>
   <C1>
      <X2>いいい</X2>
      <X2>おおお</X2>
   </C1>
   <C1>
      <X3>ううう</X3>
   </C1>
</output>

以上

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。