QA@IT
«回答へ戻る

回答を投稿

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

<?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>

以上

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

```xml
<?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
<?xml version="1.0" encoding="UTF-8"?>
<input>
    <A1>
        <XX>あああ</XX>
        <XX>いいい</XX>
        <XX>ううう</XX>
    </A1>
    <B1>
        <XX>えええ</XX>
        <XX>おおお</XX>
    </B1>
</input>

```

[出力データ]
```xml
<?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>
```
以上