2017-12-19 14 views
0

この本当に大きなXMLファイルには、実際に古い動物テストデータが含まれていますが、各行にはフィールドセットが含まれています。このファイルは、子のシーケンスを使用して実際のデータ間の関係を決定します。XSLT1子どもの可変量を持つ親からデータを確実に取得する方法

これらのフィールドを「最初のすべての最初のデータフィールド」の順に抽出し、次にすべての2番目のフィールド、3番目のフィールド、3番目のフィールドなどを抽出する必要があります。しかし、データフィールドの量は異なる行の石に設定されていませんが、同じ行では一貫しているようです。

説明するのは難しいですが、サンプルドキュメントを追加しました。最初のテーブルはソースで、2番目のテーブルは取得したい場所です。

私はノードの関係を保存するために以下のようなものを試しましたが、うまく動作しませんでした。 IDは、初心者レベルのxsltをわずかに過ぎていると言っていますが、現在のインフラストラクチャ要件のために、これをXSLT1で動作させる必要があります。

<xsl:template match="ROW"> 
    <xsl:for-each select="./anamnese/DATA"> 
     <xsl:variable name="depth"> 
      <xsl:number/> 
     </xsl:variable> 
     <xsl:value-of select=".//anamnese/DATA[$depth]"/> 
     <xsl:value-of select=".//diagnose/DATA[$depth]"/> 
     <xsl:value-of select=".//fichenr./DATA[$depth]"/> 
     <xsl:value-of select=".//vis/DATA[$depth]"/> 
     <xsl:value-of select=".//dr._A/DATA[$depth]"/> 
    </xsl:for-each> 
</xsl:template> 

偽データを持つ開始テーブルの例。 DATAフィールドの信頼性にはどのような影響があるか注意してください。

<TABLE> 
    <ROW MODID="4" RECORDID="1801"> 
     <anamnese> 
      <DATA>Gevonden in lat decubitus. Dag van huis weggeweest. Vanmorgen nog goed gegeten.</DATA> 
     </anamnese> 
     <diagnose> 
      <DATA/> 
     </diagnose> 
     <fichenr.> 
      <DATA>3607</DATA> 
     </fichenr.> 
     <vis> 
      <DATA>25/08/2017</DATA> 
     </vis> 
     <dr._A> 
      <DATA>EL</DATA> 
     </dr._A> 
    </ROW> 
    <ROW MODID="6" RECORDID="1802"> 
     <anamnese> 
      <DATA>zeer agressief geworden op korte tijd</DATA> 
      <DATA/> 
      <DATA>detartratie nodig. Eerst cardiologisch onderzoek gehad bij Valerie Bavegems. Verslag volgt nog. Drinkt redelijk veel, 500 g afgevallen</DATA> 
     </anamnese> 
     <diagnose> 
      <DATA> euthanasie</DATA> 
      <DATA/> 
      <DATA/> 
     </diagnose> 
     <fichenr.> 
      <DATA>3989</DATA> 
      <DATA>3688</DATA> 
      <DATA>3608</DATA> 
     </fichenr.> 
     <vis> 
      <DATA>2/11/2017</DATA> 
      <DATA>6/09/2017</DATA> 
      <DATA>26/08/2017</DATA> 
     </vis> 
     <dr._A> 
      <DATA>EL</DATA> 
      <DATA>EL</DATA> 
      <DATA>MA</DATA> 
     </dr._A> 
    </ROW> 
    <ROW MODID="4" RECORDID="1803"> 
     <anamnese/> 
     <diagnose/> 
     <fichenr./> 
     <vis/> 
     <dr._A/> 
    </ROW> 
</TABLE> 

所望の最終生成物。

<TABLE_B> 
    <ROW> 
     <recordId>1801</recordId> 
     <anamnese>Gevonden in lat decubitus. Vanmorgen nog goed gegeten.</anamnese> 
     <diagnose></diagnose> 
     <fichenr.>3607</fichenr.> 
     <vis>25/08/2017</vis> 
     <dr._A>EL</dr._A> 
    </ROW> 
    <ROW> 
     <recordId>1802</recordId> 
     <anamnese>zeer agressief geworden op korte tijd</anamnese> 
     <diagnose> euthanasie</diagnose> 
     <fichenr.>3989</fichenr.> 
     <vis>2/11/2017</vis> 
     <dr._A></dr._A> 
    </ROW> 
    <ROW> 
     <recordId>1802</recordId> 
     <anamnese/> 
     <diagnose></diagnose> 
     <fichenr.>3688</fichenr.> 
     <vis>6/09/2017</vis> 
     <dr._A>EL</dr._A> 
    </ROW> 
    <ROW> 
     <recordId>1802</recordId> 
     <anamnese>detartratie nodig. Eerst cardiologisch onderzoek gehad bij Valerie Bavegems. Verslag volgt nog. Drinkt redelijk veel, 500 g afgevallen</anamnese> 
     <diagnose/> 
     <fichenr.>3608</fichenr.> 
     <vis>26/08/2017</vis> 
     <dr._A>MA</dr._A> 
    </ROW> 
    <ROW> 
     <recordId>1803</recordId> 
     <anamnese/> 
     <diagnose/> 
     <fichenr./> 
     <vis/> 
     <dr._A/> 
    </ROW> 
</TABLE_B> 

私はおそらく行で可能なデータフィールドのMAX量を予測することができない場合でも、どのように私は確実に無傷で正しい関係を持つすべてのデータフィールドを抽出することができますか? (私は視覚的に266:pの行を見たことがあります)

+0

ROW構造の作成に別のテンプレートを使用することができます。下記の回答をご覧ください。 –

答えて

0

ノードanamneseは、生成される行数を決定すると仮定しています。 3人の子供がいる場合は、3行が作成されます。それが空の場合、情報は続きません。私はノードをコピーしました。

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 

    <xsl:strip-space elements="*"/> 
    <xsl:output indent="yes"/> 

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

    <xsl:template match="ROW"> 
     <xsl:variable name="ID" select="@RECORDID"/> 
      <xsl:choose> 
       <!-- Test for anamnese children. 
        If there is no child element, 
        copy the ROW child elements 
       --> 
       <xsl:when test="not(anamnese/*)"> 
        <ROW> 
         <recordId> 
          <xsl:value-of select="$ID"/> 
         </recordId> 
         <xsl:copy-of select="*"/> 
        </ROW> 
       </xsl:when> 
       <xsl:otherwise> 
        <!-- if there exists anamnese children, 
         loop through these.--> 
        <xsl:for-each select="anamnese/*"> 
         <xsl:variable name="pos" select="position()"/> 
         <ROW> 
          <recordId> 
           <xsl:value-of select="$ID"/> 
          </recordId> 
          <anamnese> 
           <xsl:value-of select="."/> 
          </anamnese> 
          <!-- loop through the following siblings of anamnese --> 
          <xsl:for-each select="../following-sibling::*"> 
           <xsl:element name="{local-name()}"> 
            <!-- select nodes with the same position --> 
            <xsl:value-of select="*[position()=$pos]"/> 
           </xsl:element> 
          </xsl:for-each> 
         </ROW> 
        </xsl:for-each> 
       </xsl:otherwise> 
      </xsl:choose> 
    </xsl:template> 


</xsl:stylesheet> 
+0

これは、私はそれがどのように動作するかを完全に理解しているので、私が行った解決策です。私は自分の必要に応じて繰り返し実行でき、魅力的でした!どうもありがとう! – Blizzerd

0

ROWブロック構造が静的な場合、最初にROWブロック構造をパラメータを持つ別のテンプレートに定義し、そのパラメータを必要なループで渡します:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
    <!--prepare template for ROW block structure--> 
    <xsl:template name="row"> 
     <!--pass recordId value--> 
     <xsl:param name="rec.id"/> 
     <!--pass ROW position number value--> 
     <xsl:param name="row.id"/> 
     <!--pass DATA position number value--> 
     <xsl:param name="data.id"/> 
     <!--creating ROW structure--> 
     <ROW> 
      <recordId> 
       <xsl:value-of select="$rec.id"/> 
      </recordId> 
      <anamnese> 
       <xsl:value-of select="//ROW[$row.id]/anamnese/DATA[$data.id]"/> 
      </anamnese> 
      <diagnose> 
       <xsl:value-of select="//ROW[$row.id]/diagnose/DATA[$data.id]"/> 
      </diagnose> 
      <fichenr.> 
       <xsl:value-of select="//ROW[$row.id]/fichenr./DATA[$data.id]"/> 
      </fichenr.> 
      <vis> 
       <xsl:value-of select="//ROW[$row.id]/vis/DATA[$data.id]"/> 
      </vis> 
      <dr._A> 
       <xsl:value-of select="//ROW[$row.id]/dr._A/DATA[$data.id]"/> 
      </dr._A>    
     </ROW>  
    </xsl:template> 

    <xsl:template match="/"> 
     <!--desired name of root node--> 
     <TABLE_B>   
      <xsl:for-each select="//anamnese"> 
       <!--get recordId number-->         
       <xsl:variable name="var.rec.id" select="../@RECORDID"/> 
       <!--get row position number--> 
       <xsl:variable name="var.row.id" select="position()"/> 
       <xsl:choose> 
        <!--check if DATA block exists--> 
        <xsl:when test="DATA"> 
         <xsl:for-each select="DATA"> 
          <xsl:call-template name="row"> 
           <xsl:with-param name="rec.id" select="$var.rec.id"/> 
           <xsl:with-param name="row.id" select="$var.row.id"/> 
           <xsl:with-param name="data.id" select="position()"/> 
          </xsl:call-template> 
         </xsl:for-each>      
        </xsl:when> 
        <!--proceed if DATA block does not exist--> 
        <xsl:otherwise> 
         <xsl:call-template name="row"> 
          <xsl:with-param name="rec.id" select="$var.rec.id"/> 
          <xsl:with-param name="row.id" select="$var.row.id"/> 
         </xsl:call-template> 
        </xsl:otherwise> 
       </xsl:choose> 
      </xsl:for-each> 
     </TABLE_B>  
    </xsl:template> 
</xsl:stylesheet> 

は、所望のようになりますあなたの入力XMLと結果でそれを試してみてください。

<?xml version="1.0" encoding="UTF-8"?> 
<TABLE_B> 
    <ROW> 
     <recordId>1801</recordId> 
     <anamnese>Gevonden in lat decubitus. Dag van huis weggeweest. Vanmorgen nog goed gegeten.</anamnese> 
     <diagnose/> 
     <fichenr.>3607</fichenr.> 
     <vis>25/08/2017</vis> 
     <dr._A>EL</dr._A> 
    </ROW> 
    <ROW> 
     <recordId>1802</recordId> 
     <anamnese>zeer agressief geworden op korte tijd</anamnese> 
     <diagnose> euthanasie</diagnose> 
     <fichenr.>3989</fichenr.> 
     <vis>2/11/2017</vis> 
     <dr._A>EL</dr._A> 
    </ROW> 
    <ROW> 
     <recordId>1802</recordId> 
     <anamnese/> 
     <diagnose/> 
     <fichenr.>3688</fichenr.> 
     <vis>6/09/2017</vis> 
     <dr._A>EL</dr._A> 
    </ROW> 
    <ROW> 
     <recordId>1802</recordId> 
     <anamnese>detartratie nodig. Eerst cardiologisch onderzoek gehad bij Valerie Bavegems. Verslag volgt nog. Drinkt redelijk veel, 500 g afgevallen</anamnese> 
     <diagnose/> 
     <fichenr.>3608</fichenr.> 
     <vis>26/08/2017</vis> 
     <dr._A>MA</dr._A> 
    </ROW> 
    <ROW> 
     <recordId>1803</recordId> 
     <anamnese/> 
     <diagnose/> 
     <fichenr./> 
     <vis/> 
     <dr._A/> 
    </ROW> 
</TABLE_B> 
0

これはあなたを助けるかもしれません。

<xsl:template match="TABLE"> 
    <xsl:element name="TABLE_B"> 
    <xsl:apply-templates select="ROW"/> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="ROW"> 
    <xsl:apply-templates select="anamnese"> 
    <xsl:with-param name="RECORDID" select="@RECORDID"/> 
    </xsl:apply-templates> 
</xsl:template> 

<xsl:template match="anamnese"> 
    <xsl:param name="RECORDID"/> 
    <xsl:apply-templates select="DATA"> 
    <xsl:with-param name="RECORDID" select="$RECORDID"/> 
    </xsl:apply-templates> 

    <xsl:if test="not(DATA)"> 
    <xsl:element name="ROW"> 
     <xsl:element name="recordId"> 
     <xsl:value-of select="$RECORDID"/> 
     </xsl:element> 

     <xsl:element name="anamnese"> 
     <xsl:value-of select="text()"/> 
     </xsl:element> 

     <xsl:apply-templates select="following-sibling::*"/> 

    </xsl:element> 
    </xsl:if> 
</xsl:template> 

<xsl:template match="DATA"> 
    <xsl:param name="RECORDID"/> 
    <xsl:variable name="position" select="position()"/> 

    <xsl:element name="ROW"> 
    <xsl:element name="recordId"> 
     <xsl:value-of select="$RECORDID"/> 
    </xsl:element> 

    <xsl:element name="anamnese"> 
     <xsl:value-of select="text()"/> 
    </xsl:element> 

    <xsl:element name="diagnose"> 
     <xsl:value-of select="../../diagnose/DATA[$position]"/> 
    </xsl:element> 

    <xsl:element name="fichenr."> 
     <xsl:value-of select="../../fichenr./DATA[$position]"/> 
    </xsl:element> 

    <xsl:element name="vis"> 
     <xsl:value-of select="../../vis/DATA[$position]"/> 
    </xsl:element> 

    <xsl:element name="dr._A"> 
     <xsl:value-of select="../../dr._A/DATA[$position]"/> 
    </xsl:element> 

    </xsl:element> 
</xsl:template> 


<xsl:template match="@* | node()"> 
    <xsl:copy> 
    <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
</xsl:template> 
関連する問題