2017-02-07 15 views
1

私はXSLTを介してxmlからxmlへの変換に取り組んでいます。特定の順序で子要素を追加する

stylesheet.xsl

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns="http://www.test.org" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.0"> <!-- xs namespace allows typed functions and parameters --> 
<xsl:output method="xml" indent="yes" version="1.0" encoding="UTF-8" omit-xml-declaration="yes"/> 
<xsl:strip-space elements="*" /> 

<xsl:param name="other-id" select="Request/Order/OtherId" /> 

<xsl:template match="*"> 
    <xsl:element name="{local-name()}"> 
     <xsl:copy-of select="@*" copy-namespaces="no" /> 
     <xsl:apply-templates select="@*|node()" /> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="@*|text()|comment()|processing-instruction()"> 
    <xsl:copy /> 
</xsl:template> 

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

<xsl:template match="Details"> 
    <xsl:element name="{local-name()}"> 
     <xsl:element name="Signon> 
      <xsl:element name="SignonDt>2017-01-01</xsl:element> 
      <xsl:element name="MessageQuantity">3</xsl:element> 
     <xsl:element> 
     <xsl:apply-templates /> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="NotificationRq"> 
    <xsl:element name="{local-name()}"> 
     <xsl:element name="RqUID">Test</xsl:element> 
     <xsl:apply-templates /> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="Policy/SDDCd" /> 

<xsl:template match="Policy"> 
    <xsl:element name="{local-name()}"> 
     <xsl:element name="RFDCd"> 
      <xsl:call-template name="getRFDCd" /> 
     </xsl:element> 
     <xsl:apply-templates /> 
    </xsl:element> 
</xsl:template> 

<xsl:template name="getRFDCd"> 
    <xsl:choose> 
     <xsl:when test="contains($other-id, 'RFD 2')"> 
      <xsl:text>AUB</xsl:text> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:text>CL</xsl:text> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

<xsl:template match="Contact/Addr" > 
    <xsl:element name="{local-name()}"> 
     <xsl:element name="AddrTypeCd">StreetAddress</xsl:element> 
     <xsl:apply-templates /> 
    </xsl:element> 
</xsl:template> 

<!-- other templates structured similar to these --> 

input.xmlに

<Request> 
    <Details> 
     <NotificationRq> 
      <RqDate>2017-01-01</RqDate> 
      <RqDetails> 
      <!-- other children --> 
      <RqDetails> 
     </NotificationRq> 
     <Policy> 
      <PolNumber>1234567890</PolNumber> 
      <SDDCd>T35</SDDCd> 
     </Policy> 
     <Contact> 
      <Addr> 
       <AddrLn1>Test address line 1</AddrLn1> 
       <AddrLn2>Test address line 2</AddrLn2> 
       <PostCode>AX12D3</PostCode> 
      </Addr> 
     </Contact> 
     <!-- other children --> 
    </Details> 
</Request> 

のOutput.xml

<Details xmlns="http://test.org"> 
    <Signon> 
     <SignonDt>2017-01-01</Signon> 
     <MessageQuantity>3</MessageQuantity> 
    </Signon> 
    <NotificationRq> 
     <RqUId>Test</RqUID> 
     <RqDate>2017-01-01</RqDate> 
     <RqDetails> 
      <!-- other children --> 
     <RqDetails> 
    </NotificationRq> 
    <Policy> 
     <RFDCd>CL</RFDCd> 
     <PolNumber>1234567890</PolNumber> 
    </Policy> 
    <Contact> 
     <Addr> 
      <AddrTypeCd>StreetAddress</AddrTypeCd> 
      <AddrLn1>Test address line 1</AddrLn1> 
      <AddrLn2>Test address line 2</AddrLn2> 
      <PostCode>AX12D3</PostCode> 
     </Addr> 
    </Contact> 
    <!-- other children --> 
</Details> 

注:私は、以下の持っています:以前の問題により<xsl:element name="{local-name()}">が使用されています。私は新しい出力に名前空間を持たないソースXMLをコピーしています。このソリューションは、恒等変換と一緒に余分なテンプレートとともにすべての要素に追加される名前空間属性の問題を修正しました。

問題は、このxmlスキーマの検証が行われる下流に送信されます。そのため、新しく作成された子要素の位置が重要になります。上記のスニペットに示すように、新しい子要素が親の最初の子として追加されます。これはうまくいく場合もありますが、これはどこにあるべきですか?作成された要素の約半分は、最後に表示する必要があります(奇数の1〜2を指定した位置に挿入する必要があります)。それでもここでは、例としてinput.xmlに使用することで所望の出力がどのように見えるべきかです:

希望-のOutput.xml

<Details xmlns="http://test.org"> 
    <NotificationRq> 
     <RqDate>2017-01-01</RqDate> 
     <RqDetails> 
      <!-- other children --> 
     <RqDetails> 
     <RqUId>Test</RqUID> 
    </NotificationRq> 
    <Signon> 
     <SignonDt>2017-01-01</Signon> 
     <MessageQuantity>3</MessageQuantity> 
    </Signon> 
    <Policy> 
     <PolNumber>1234567890</PolNumber> 
     <RFDCd>CL</RFDCd> 
    </Policy> 
    <Contact> 
     <Addr> 
      <AddrLn1>Test address line 1</AddrLn1> 
      <AddrLn2>Test address line 2</AddrLn2> 
      <AddrTypeCd>StreetAddress</AddrTypeCd> 
      <PostCode>AX12D3</PostCode> 
     </Addr> 
    </Contact> 
    <!-- other children --> 
</Details> 

の既存の子の順序で指定する方法があります要素は新しい子供が表示されるはずですか?私のテンプレートの1つで、挿入命令が常に最初の位置にあるのですか?

その他の情報:特定のオーダーの挿入についてはいくつか質問がありますが、通常は一連の要素、または一連の繰り返し要素(例:別の著者要素を一連の著者要素に挿入するにはどうすればよいのでしょうか?ソリューションでは、正しいインデックスにループされているかどうかを判断するために位置関数を使用する傾向があります。私が扱っているXMLは、値を保持するかもしれないいくつかの子(子を含むものなどのいくつか)を含むかもしれないユニークな要素で構成されています。 xmlには繰り返し要素がありませんので、上記のような解決法を使用することはできません(要素の反復子でないことに対して誰かがこのようなことをしない限り)。また、私はサクソンHEバージョン9.7.0-8

答えて

1

を使用していますなぜあなたは単に行うことはできません。

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns="http://www.test.org"> 
<xsl:output method="xml" indent="yes" version="1.0" encoding="UTF-8" omit-xml-declaration="yes"/> 
<xsl:strip-space elements="*" /> 

<xsl:template match="*"> 
    <xsl:element name="{local-name()}"> 
     <xsl:copy-of select="@*" /> 
     <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="comment()|processing-instruction()"> 
    <xsl:copy/> 
</xsl:template> 

<xsl:template match="/*"> 
    <xsl:apply-templates/> 
</xsl:template> 

<xsl:template match="NotificationRq"> 
    <NotificationRq> 
     <xsl:apply-templates/> 
     <RqUId>Test</RqUId> 
    </NotificationRq> 
</xsl:template> 

</xsl:stylesheet> 
+0

だけではなく、 ''対要素自体を使用する理由あなたが意味する場合は、私は問題を経験しましたxsl:Elementで定義されていない限りカスタム要素は表示されません(変圧器エンジンの問題でしょうか?)。要素を ''で定義すると、それは依然として ' 'の最初の子として' 'を表示させます。また、テンプレートのselect文の一部を削除したことがわかりました。これは意図的なものなのでしょうか? – jbailie1991

+0

私はあなたの入力と希望の出力を見て、私が考えていることを提案しました。結果はあなたが要求した結果と同じではありませんか? –

+0

いいえ、要素のデカルトで ' 'の位置を入れ替えようとしましたが、結果は「望ましくない」出力と同じでした。 RqUIdはまだ最後の – jbailie1991

関連する問題