0

プレフィックス付きの型 [xsi:type"..."] を各繰り返しの親ノードに追加し、そのすべての子ノードを選択する方法を知りたいです。xml は SOAP エンベロープであり、出力はエンベロープのヘッダーとボディの変更です。サンプルの入力 xml は次のとおりです。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns="http://Example1.com"
xmlns:ns1="http://Sample1.com">

<soapenv:Header>
    <ns:SessionHeader>
        <ns:Auth>a1b2c4d5</ns:Auth>
    </ns:SessionHeader>
</soapenv:Header>
<soapenv:Body>
    <ns:Create>
        <!--Zero or more repetitions:-->
        <ns:BankAccount>
            <ns1:AccountNumber>1111</ns1:AccountNumber>
            <ns1:BillingState>Texas</ns1:BillingState>
            <ns1:Name>John</ns1:Name>
            <ns1:Phone>+1 111</ns1:Phone>
            <ns1:Site>Chicago</ns1:Site>
            <ns1:Website>www.site1.com</ns1:Website>
            .
            .
        </ns:BankAccount>
      <ns:BankAccount>
            <ns1:AccountNumber>222</ns1:AccountNumber>
            <ns1:BillingState>Hawai</ns1:BillingState>
            <ns1:Name>Bob</ns1:Name>
            <ns1:Phone>+2 222</ns1:Phone>
            <ns1:Site>Canada</ns1:Site>
            <ns1:Website>www.site2.com</ns1:Website>
            .
            .
        </ns:BankAccount>
        .
        .
        . 
    </ns:Create>
</soapenv:Body>
</soapenv:Envelope> 

指定された入力 xml に必要な出力 xml は次のとおりです。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:ns="http://Example1.com" 
xmlns:ns1="http://Sample1.com" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <soapenv:Header>
        <ns:SessionHeader>
            <ns:Auth>a1b2c4d5</ns:Auth>
        </ns:SessionHeader>
    </soapenv:Header>
    <soapenv:Body>
        <ns:Create>
           <ns:BankAccount xsi:type="Account" xmlns="http://Example1.com" >
            <ns1:AccountNumber>1111</ns1:AccountNumber>
            <ns1:BillingState>Texas</ns1:BillingState>
            <ns1:Name>John</ns1:Name>
            <ns1:Phone>+1 111</ns1:Phone>
            <ns1:Site>Chicago</ns1:Site>
            <ns1:Website>www.site1.com</ns1:Website>
              .
              .
          </ns:BankAccount>

          <ns:BankAccount xsi:type="Account" xmlns="http://Example1.com" >
            <ns1:AccountNumber>222</ns1:AccountNumber>
            <ns1:BillingState>Hawai</ns1:BillingState>
            <ns1:Name>Bob</ns1:Name>
            <ns1:Phone>+2 222</ns1:Phone>
            <ns1:Site>Canada</ns1:Site>
            <ns1:Website>www.site2.com</ns1:Website>
              .
              .
          </ns:BankAccount>

          .
          .
          .

        </ns:Create>
    </soapenv:Body>
</soapenv:Envelope> 

以下の XSL を試してみましたが、必要な結果が得られません。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" indent="yes"/>

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

    <xsl:template match="/">
        <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
        xmlns:ns="http://Example1.com"
        xmlns:ns1="http://Sample1.com"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <soapenv:Header>
            <ns:SessionHeader>
                <ns:Auth>
                    <xsl:value-of select="//ns:Auth"/>
                </ns:Auth>
            </ns:SessionHeader>
        </soapenv:Header>
        <soapenv:Body>
            <ns:Create>
                <ns:BankAccount xsi:type="Account" xmlns="http://Example1.com">
                  <xsl:apply-template select="node()"/>
                </ns:BankAccount>
            </ns:Create>
        </soapenv:Body>
    </soapenv:Envelope>
</xsl:template>

</xsl:stylesheet>

どこが間違っているのかわかりません。最初にすべての親「BankAccount」ノードをプレフィックス追加用の要素とともに取得してから、SOAP エンベロープを元に戻す必要がありますか? 私を案内してください。

4

1 に答える 1