1

以下を変換しようとして問題があります。入力には、以下のレベルとして示されている親子関係があります。Parent_Identifierタグは、子を親に関連付けるのに役立ちます。XSLT 変換の問題は何ですか? この投稿で言及されている変換を使用しました: Xslt group parent/childですが、うまくいかないようです。

入力ドキュメント

<DBAdapterOutputCollection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.oracle.com/pcbpel/adapter/db/DBAdapter">
  <DBAdapterOutput>
    <LEVEL>1</LEVEL>      
    <IDENTIFIER>9536162</IDENTIFIER>
    <PARENT_IDENTIFIER xsi:nil="true"/>
    <LINE_NUMBER>1.1.0</LINE_NUMBER>    
  </DBAdapterOutput>

 <DBAdapterOutput>
  <LEVEL>2</LEVEL>
  <IDENTIFIER>9536165</IDENTIFIER>
  <PARENT_IDENTIFIER>9536162</PARENT_IDENTIFIER>
  <LINE_NUMBER>1.1.1</LINE_NUMBER>
  <ORDER_NUMBER>1554828</ORDER_NUMBER>
 </DBAdapterOutput>
 <DBAdapterOutput>
  <LEVEL>2</LEVEL>    
  <IDENTIFIER>9536173</IDENTIFIER>
  <PARENT_IDENTIFIER>9536162</PARENT_IDENTIFIER>
  <LINE_NUMBER>1.1.7</LINE_NUMBER>
  <ORDER_NUMBER>1554828</ORDER_NUMBER>
 </DBAdapterOutput>
 <DBAdapterOutput>
  <LEVEL>3</LEVEL>
  <IDENTIFIER>1227973</IDENTIFIER>
  <PARENT_IDENTIFIER>9536165</PARENT_IDENTIFIER>
  <LINE_NUMBER>1.1.4</LINE_NUMBER>
  <ORDER_NUMBER>1554828</ORDER_NUMBER>
 </DBAdapterOutput>
 <DBAdapterOutput>
  <LEVEL>3</LEVEL>
  <IDENTIFIER>1275015</IDENTIFIER>
  <PARENT_IDENTIFIER>9536165</PARENT_IDENTIFIER>
  <LINE_NUMBER>1.1.4</LINE_NUMBER>
  <ORDER_NUMBER>1554828</ORDER_NUMBER>
 </DBAdapterOutput>
</DBAdapterOutputCollection>

期待される出力ドキュメント

<WMSAssetInterface_Input xmlns="http://siebel.com/CustomUI">
 <ListOfAsset xmlns="http://www.siebel.com/xml/ThinComergentAsset">
  <ListOfAssetHeader>
    <AssetHeader>
     <IntegrationId>9536162 1.1.0</IntegrationId>
     <ProductName>1.1.0</ProductName>
     <ListOfAssetItem>
       <AssetItem>
         <IntegrationId>9536162 1.1.0 Level=1</IntegrationId>
         <ProductName>1.1.0</ProductName>
         <ListOfAssetItem>
            <AssetItem>
               <IntegrationId>9536165 1.1.1 Level=2</IntegrationId>
               <ProductName>1.1.1</ProductName>
               <ListOfAssetItem>
                 <AssetItem>
                   <IntegrationId>1227973 1.1.4 Level=3</IntegrationId>
                   <ProductName>1.1.4</ProductName>
                  </AssetItem>
                  <AssetItem>
                    <IntegrationId>1275015 1.1.4 Level=3</IntegrationId>
                    <ProductName>1.1.4</ProductName>
                  </AssetItem>
               </ListOfAssetItem>
            </AssetItem>
            <AssetItem>
              <IntegrationId>9536173 1.1.7 Level=2</IntegrationId>
              <ProductName>1.1.7</ProductName>
            </AssetItem>
         </ListOfAssetItem>
       </AssetItem>
     </ListOfAssetItem>
   </AssetHeader>
  <ListOfAssetHeader>
 </ListOfAsset>
</WMSAssetInterface_Input>

これが私が使用しようとしている XSLT です。なぜこれが機能しないのですか?

<xsl:stylesheet version="1.0" xmlns:ns0="http://xmlns.oracle.com/pcbpel/adapter/db/DBAdapter" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsdLocal1="http://www.siebel.com/xml/ThinComergentAsset" xmlns:tns="http://siebel.com/CustomUI" exclude-result-prefixes="tns" >
<xsl:template match="/ns0:DBAdapterOutputCollection">
<tns:WMSAssetInterface_Input>
  <xsdLocal1:ListOfAsset>
    <xsdLocal1:ListOfAssetHeader>
      <xsdLocal1:AssetHeader>
        <xsdLocal1:IntegrationId>
          <xsl:value-of select='concat(ns0:DBAdapterOutput/ns0:IDENTIFIER," ",ns0:DBAdapterOutput/ns0:LINE_NUMBER," Level=",ns0:DBAdapterOutput/ns0:LEVEL)'/>
        </xsdLocal1:IntegrationId>
        <xsdLocal1:ProductName>
          <xsl:value-of select="ns0:DBAdapterOutput/ns0:LINE_NUMBER"/>
        </xsdLocal1:ProductName>
         <xsl:apply-templates select="ns0:DBAdapterOutputCollection/ns0:DBAdapterOutput[string-length(ns0:PARENT_IDENTIFIER)=0]" />
          </xsdLocal1:AssetHeader>
    </xsdLocal1:ListOfAssetHeader>
   </xsdLocal1:ListOfAsset>
 </tns:WMSAssetInterface_Input>
</xsl:template>

<xsl:template match="ns0:DBAdapterOutput">
  <xsdLocal1:ListOfAssetItem>
          <xsdLocal1:AssetItem>
            <xsdLocal1:IntegrationId>
              <xsl:value-of select='concat(ns0:IDENTIFIER," ",ns0:LINE_NUMBER," Level=",ns0:LEVEL)'/>
            </xsdLocal1:IntegrationId>
            <xsdLocal1:PartName>
              <xsl:value-of select="ns0:LINE_NUMBER"/>
            </xsdLocal1:PartName>
             <xsl:variable name="children" select="parent::*/ns0:DBAdapterOutput[ns0:PARENT_IDENTIFIER=current()/ns0:IDENTIFIER]" />
    <xsl:if test="$children">
        <xsdLocal1:ListOfAssetItem>
          <xsdLocal1:AssetItem>
            <xsl:apply-templates select="$children" />
         </xsdLocal1:AssetItem>
          </xsdLocal1:ListOfAssetItem>
    </xsl:if>
         </xsdLocal1:AssetItem>
       </xsdLocal1:ListOfAssetItem>
   </xsl:template>
</xsl:stylesheet>
4

2 に答える 2

1

まず、コードの読みにくさについての観察- 今後の質問では、短い行でよくインデントされたコードを提供してください!

簡単に修正できる大きな問題が 1 つあります。

これを変更します

<xsl:apply-templates select=
"ns0:DBAdapterOutputCollection/ns0:DBAdapterOutput
             [string-length(ns0:PARENT_IDENTIFIER)=0]" />

これに

<xsl:apply-templates select=
"ns0:DBAdapterOutput
             [string-length(ns0:PARENT_IDENTIFIER)=0]" />

ns0:DBAdapterOutputCollection変更する必要がある XSLT 命令は、現在のノードが最上位の要素を持つテンプレートにあります 。これは、述語の条件を満たし、現在のノードの任意の 子の子である 要素のいずれかにテンプレートを適用する必要があることを指定します。ns0:DBAdapterOutputns0:DBAdapterOutputCollection

ただし、現在のノード (最上位のns0:DBAdapterOutputCollection要素) には子ns0:DBAdapterOutputCollectionノードがなく、このxsl:apply-templates命令によって実行されるノードは選択されません。

上記の単純なコード変更が行われた後、変換の結果はおそらく必要なもののように見えます:

<?xml version="1.0" encoding="utf-8"?>
<tns:WMSAssetInterface_Input xmlns:tns="http://siebel.com/CustomUI" xmlns:ns0="http://xmlns.oracle.com/pcbpel/adapter/db/DBAdapter" xmlns:xsdLocal1="http://www.siebel.com/xml/ThinComergentAsset">
    <xsdLocal1:ListOfAsset>
        <xsdLocal1:ListOfAssetHeader>
            <xsdLocal1:AssetHeader>
                <xsdLocal1:IntegrationId>9536162 1.1.0 Level=1</xsdLocal1:IntegrationId>
                <xsdLocal1:ProductName>1.1.0</xsdLocal1:ProductName>
                <xsdLocal1:ListOfAssetItem>
                    <xsdLocal1:AssetItem>
                        <xsdLocal1:IntegrationId>9536162 1.1.0 Level=1</xsdLocal1:IntegrationId>
                        <xsdLocal1:PartName>1.1.0</xsdLocal1:PartName>
                        <xsdLocal1:ListOfAssetItem>
                            <xsdLocal1:AssetItem>
                                <xsdLocal1:ListOfAssetItem>
                                    <xsdLocal1:AssetItem>
                                        <xsdLocal1:IntegrationId>9536165 1.1.1 Level=2</xsdLocal1:IntegrationId>
                                        <xsdLocal1:PartName>1.1.1</xsdLocal1:PartName>
                                        <xsdLocal1:ListOfAssetItem>
                                            <xsdLocal1:AssetItem>
                                                <xsdLocal1:ListOfAssetItem>
                                                    <xsdLocal1:AssetItem>
                                                        <xsdLocal1:IntegrationId>1227973 1.1.4 Level=3</xsdLocal1:IntegrationId>
                                                        <xsdLocal1:PartName>1.1.4</xsdLocal1:PartName>
                                                    </xsdLocal1:AssetItem>
                                                </xsdLocal1:ListOfAssetItem>
                                                <xsdLocal1:ListOfAssetItem>
                                                    <xsdLocal1:AssetItem>
                                                        <xsdLocal1:IntegrationId>1275015 1.1.4 Level=3</xsdLocal1:IntegrationId>
                                                        <xsdLocal1:PartName>1.1.4</xsdLocal1:PartName>
                                                    </xsdLocal1:AssetItem>
                                                </xsdLocal1:ListOfAssetItem>
                                            </xsdLocal1:AssetItem>
                                        </xsdLocal1:ListOfAssetItem>
                                    </xsdLocal1:AssetItem>
                                </xsdLocal1:ListOfAssetItem>
                                <xsdLocal1:ListOfAssetItem>
                                    <xsdLocal1:AssetItem>
                                        <xsdLocal1:IntegrationId>9536173 1.1.7 Level=2</xsdLocal1:IntegrationId>
                                        <xsdLocal1:PartName>1.1.7</xsdLocal1:PartName>
                                    </xsdLocal1:AssetItem>
                                </xsdLocal1:ListOfAssetItem>
                            </xsdLocal1:AssetItem>
                        </xsdLocal1:ListOfAssetItem>
                    </xsdLocal1:AssetItem>
                </xsdLocal1:ListOfAssetItem>
            </xsdLocal1:AssetHeader>
        </xsdLocal1:ListOfAssetHeader>
    </xsdLocal1:ListOfAsset>
</tns:WMSAssetInterface_Input>
于 2012-07-23T12:37:02.720 に答える
1

2 つのコンパイル時エラー:

  1. tns: プレフィックスは、どの名前空間にもバインドされていません。

  2. スタイルシートのこの行はナンセンスです。

    <xsl:value-of select='concat(/ns0:IDENTIFIER," ",/ns0:LINE_NUMBER," Level=",/ns0:DBAdapterOutput/ns0:LEVEL')'/>
    
  3. スタイルシートの終了タグがありません。

アップデート

スタイルシートのいくつかのエラーを修正しました。

  1. <xsl:template match="ns0:DBAdapterOutput/" /> は無効です。最後の / を削除します。
  2. <xsl:template match="/ns0:DBAdapterOutputCollection"> と同様

アップデート

ここでのテクニックは、 xsl:apply-templates を再帰的に使用してレベルをドリルダウンすることです。レコードは 2 つのリンク フィールドを比較するだけで親と照合されますが、別の方法としてキーを使用することもできます。

この XSLT 1.0 スタイルシート...

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:ns0="http://xmlns.oracle.com/pcbpel/adapter/db/DBAdapter"
  xmlns:xsdLocal1="http://www.siebel.com/xml/ThinComergentAsset"
  exclude-result-prefixes="xsl xsdLocal1 ns0">
<xsl:output method="xml" indent="yes"/>

<xsl:template match="/">
 <WMSAssetInterface_Input xmlns="http://siebel.com/CustomUI">
  <ListOfAsset xmlns="http://www.siebel.com/xml/ThinComergentAsset">
   <ListOfAssetHeader>
     <xsl:apply-templates select="*/ns0:DBAdapterOutput[ns0:LEVEL=1]" /> 
   </ListOfAssetHeader>
  </ListOfAsset>
 </WMSAssetInterface_Input>
</xsl:template>
            
<xsl:template match="ns0:DBAdapterOutput[ns0:LEVEL=1]"
  xmlns="http://www.siebel.com/xml/ThinComergentAsset">
  <AssetHeader>
    <IntegrationId>
      <xsl:value-of select="concat(ns0:IDENTIFIER,' ',ns0:LINE_NUMBER)" /> 
    </IntegrationId>
    <ProductName>
      <xsl:value-of select="ns0:LINE_NUMBER" />
    </ProductName>
    <ListOfAssetItem>
      <xsl:apply-templates select="../ns0:DBAdapterOutput
                [           ns0:LEVEL=
                 (current()/ns0:LEVEL+1)]" /> 
    </ListOfAssetItem>
  </AssetHeader>
</xsl:template>
    
<xsl:template match="ns0:DBAdapterOutput[ns0:LEVEL &gt; 1]"
      xmlns="http://www.siebel.com/xml/ThinComergentAsset">
  <AssetItem>
    <IntegrationId>
      <xsl:value-of select="concat(ns0:IDENTIFIER,' ',ns0:LINE_NUMBER,
      ' Level=', ns0:LEVEL/text()-1)" /> 
    </IntegrationId>
    <ProductName>
      <xsl:value-of select="ns0:LINE_NUMBER" />
    </ProductName>
    <xsl:if test="../ns0:DBAdapterOutput
                [ns0:PARENT_IDENTIFIER = current()/ns0:IDENTIFIER]">
     <ListOfAssetItem>
      <xsl:apply-templates select="../ns0:DBAdapterOutput
                [ns0:PARENT_IDENTIFIER = current()/ns0:IDENTIFIER]" /> 
     </ListOfAssetItem>
    </xsl:if>
  </AssetItem>
</xsl:template>
    
</xsl:stylesheet>
    

...サンプル入力に適用すると...

<WMSAssetInterface_Input xmlns="http://siebel.com/CustomUI">
  <ListOfAsset xmlns="http://www.siebel.com/xml/ThinComergentAsset">
    <ListOfAssetHeader>
      <AssetHeader>
        <IntegrationId>9536162 1.1.0</IntegrationId>
        <ProductName>1.1.0</ProductName>
        <ListOfAssetItem>
          <AssetItem>
            <IntegrationId>9536165 1.1.1 Level=1</IntegrationId>
            <ProductName>1.1.1</ProductName>
            <ListOfAssetItem>
              <AssetItem>
                <IntegrationId>1227973 1.1.4 Level=2</IntegrationId>
                <ProductName>1.1.4</ProductName>
              </AssetItem>
              <AssetItem>
                <IntegrationId>1275015 1.1.4 Level=2</IntegrationId>
                <ProductName>1.1.4</ProductName>
              </AssetItem>
            </ListOfAssetItem>
          </AssetItem>
          <AssetItem>
            <IntegrationId>9536173 1.1.7 Level=1</IntegrationId>
            <ProductName>1.1.7</ProductName>
          </AssetItem>
        </ListOfAssetItem>
      </AssetHeader>
    </ListOfAssetHeader>
  </ListOfAsset>
</WMSAssetInterface_Input>

これは、記載されている期待される出力とはわずかに異なりますが、リストされている期待される出力に誤りがあるためです。これがあなたが望むものを届けると信じています。

于 2012-07-23T06:18:42.657 に答える