2016-09-12 4 views
0

皆さん、xsl変換で私を助けてください。 私はすべてを試しましたが、うまくいきません。 ソースXML:から:(単に要素の名前を変更し、1スキーム1):XSL変換for-eachは動作しません

<xs:element name="ROWSET" type="mule:ROWSET"/> 
    <xs:complexType name="ROWSET"> 
     <xs:sequence> 
     <xs:element name="ROW" type="mule:ROW" maxOccurs="unbounded"/>   
     </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="ROW"> 
     <xs:sequence> 
     <xs:element name="ID" type="xs:string"/> 
     <xs:element name="F_I" type="xs:string"/> 
     <xs:element name="NAME" type="mule:string256"/> 
     <xs:element name="CODE" type="mule:CODE"/>    
     <xs:element name="CARD_PRODUCTS" type="mule:CARD_PRODUCTS"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="CARD_PRODUCTS"> 
     <xs:sequence> 
     <xs:element name="CARD_PRODUCTS_ROW" type="mule:CARD_PRODUCTS_ROW" maxOccurs="unbounded"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="CARD_PRODUCTS_ROW"> 
     <xs:sequence> 
     <xs:element name="ID" type="xs:string"/> 
     <xs:element name="F_I" type="xs:string"/> 
     <xs:element name="NAME" type="mule:string256"/> 
     <xs:element name="CODE" type="mule:CODE"/>    
     </xs:sequence> 
    </xs:complexType> 

に:

<xs:element name="SalaryProducts" type="sapr:SalaryProducts"/> 
    <xs:complexType name="SalaryProducts"> 
     <xs:sequence> 
     <xs:element name="SalaryProduct" type="sapr:SalaryProduct" maxOccurs="unbounded"/>   
     </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="SalaryProduct"> 
     <xs:sequence> 
     <xs:element name="id" type="xs:string"/> 
     <xs:element name="finInstId" type="xs:string"/> 
     <xs:element name="name" type="sapr:string256"/> 
     <xs:element name="productCode" type="sapr:productCode"/> 
     <xs:element name="CardProducts" type="sapr:CardProducts"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="CardProducts"> 
     <xs:sequence> 
     <xs:element name="CardProduct" type="sapr:CardProduct" maxOccurs="unbounded"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="CardProduct"> 
     <xs:sequence> 
     <xs:element name="id" type="xs:string"/> 
     <xs:element name="finInstId" type="xs:string"/> 
     <xs:element name="name" type="sapr:string256"/> 
     <xs:element name="productCode" type="sapr:productCode"/>    
     </xs:sequence> 
    </xs:complexType> 

XSLT:

<?xml version="1.0" encoding="UTF-8" ?> 

    <xsl:template match="/"> 
     <tns:SalaryProducts> 
     <xsl:for-each select="/ns0:ROWSET/ns0:ROW"> 
      <tns:SalaryProduct> 
       <tns:id> 
        <xsl:value-of select="ns0:ID"/> 
       </tns:id> 
       <tns:finInstId> 
        <xsl:value-of select="ns0:F_I"/> 
       </tns:finInstId> 
       <tns:name> 
        <xsl:value-of select="ns0:NAME"/> 
       </tns:name> 
       <tns:productCode> 
        <xsl:value-of select="ns0:CODE"/> 
       </tns:productCode>     
       <tns:CardProducts> 
        <xsl:for-each select="/ns0:ROWSET/ns0:ROW/ns0:CARD_PRODUCTS/ns0:CARD_PRODUCTS_ROW"> 
        <tns:CardProduct> 
         <tns:id> 
          <xsl:value-of select="ns0:ID"/> 
         </tns:id> 
         <tns:finInstId> 
          <xsl:value-of select="ns0:F_I"/> 
         </tns:finInstId> 
         <tns:name> 
          <xsl:value-of select="ns0:NAME"/> 
         </tns:name> 
         <tns:productCode> 
          <xsl:value-of select="ns0:CODE"/> 
         </tns:productCode>        
        </tns:CardProduct> 
        </xsl:for-each> 
       </tns:CardProducts> 
      </tns:SalaryProduct> 
     </xsl:for-each> 
     </tns:SalaryProducts> 
    </xsl:template> 
</xsl:stylesheet> 

<ROWSET> 
<ROW> 
    <ID>111</ID> 
    <F_I>11</F_I> 
    <NAME>sometext</NAME> 
    <CODE>text</CODE>  
    <CARD_PRODUCTS> 
    <CARD_PRODUCTS_ROW> 
    <ID>111</ID> 
    <F_I>11</F_I> 
    <NAME>text</NAME> 
    <CODE>text</CODE>   
    </CARD_PRODUCTS_ROW> 
    <CARD_PRODUCTS_ROW> 
    <ID>111</ID> 
    <F_I>11</F_I> 
    <NAME>text</NAME> 
    <CODE>text</CODE>   
    </CARD_PRODUCTS_ROW> 
    ... 
    </CARD_PRODUCTS> 
</ROW> 
</ROWSET> 

これは変換されなければなりません

xsltは正常です(私の意見では)、それはちょうど仕事をしません。 JDeveloperの唯一のことは、「要素tnsの中に必要な子のSalaryProductがありません:SalaryProducts」です。

ご協力いただければ幸いです。私を助けてください。前もって感謝します!

+0

あなたのスタイルシートには、の開始タグはありません。入力にネームスペースがないので、なぜあなたのスタイルシートは接頭辞を使用しますか? –

+0

があります。私は簡潔さのためにここでそれを逃した。 – PaulV

答えて

0

要素の名前を変更するのが最も簡単な方法は、新しい要素を新しい名前で作成する各( "古い")要素のテンプレートを定義することです。

<xsl:template match="oldname"> 
    <xsl:element name="newname"> 
     <xsl:apply-templates /> 
    </xsl:element> 
</xsl:template> 

また、あなたが他のすべてのテンプレートが必要になります(いずれかが存在する場合...)テキストは、属性

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

これは、次のようなものになります:(

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="xml" encoding="UTF-8" indent="yes" /> 

    <xsl:template match="ROWSET"> 
     <xsl:element name="SalaryProducts"> 
      <xsl:apply-templates /> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="ROW"> 
     <xsl:element name="SalaryProduct"> 
      <xsl:apply-templates /> 
     </xsl:element> 
    </xsl:template> 

    <!-- ... all other element "mappings" --> 

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

をここで試すことができます:http://xsltransform.net/bFWR5DS

例では、いくつかの名前空間を使用しています。私はそれらについてもっと学ぶことをお勧めします。しかし、この場合は、ネームスペースを使用する理由を見つけることができず、あなたのxslでそれらを使用しているとは思われませんでした。

0

ありがとうございました。問題は解決された。 本当に、問題はxsl式の名前空間 'ns0:'にありました。 したがって、問題を解決するには2つの方法があります。

  1. xslで「ns0:」を削除します。
  2. この記事のようにOSB要素「Rename」(XPath式.//*)を使用してxmlの各要素にnamespaceを割り当てます。http://yuanmengblog.blogspot.com/2011/08/replace-rename-namespace-in-osb.htmlそれはもっと複雑ですが、何らかの理由で役に立つかもしれません。
関連する問題