2016-12-01 6 views
0

XSLテンプレートを使用して、次のXML構造の入力を変換する必要があります。XSLテンプレートを使用してXMLを変換する

<?xml version="1.0" encoding="Windows-1252" standalone="no"?> 
<ECG> 
    <R000>4</R000> 
    <R001> 
    <A01>R1 A1 Data</A01> 
    <A02>R1 A2 Data</A02> 
    <A03>R2 A3 Data</A03> 
    </R001> 
    <R002> 
    <A01>R2 A1 Data</A01> 
    <A02>R2 A2 Data</A02> 
    <A03>R2 A3 Data</A03> 
    </R002> 
    <R003> 
    <A01>R3 A1 Data</A01> 
    <A02>R3 A2 Data</A02> 
    <A03>R3 A3 Data</A03> 
    </R003> 
    <R004> 
    <A01>R4 A1 Data</A01> 
    <A02>R4 A2 Data</A02> 
    <A03>R4 A3 Data</A03> 
    </R004> 
</ECG> 

タグR000は、多くのRXXXレジスタはXMLが含まれています方法を決定します。この考え方は、XSLを使用してXMLを次の出力に変換することです。この場合、値を4つのR000に適用します。この考え方は、入力に乱数を使用することで、n個のレジスタを処理します。 A01A02A03のタグが常に表示されます。 RXXXの番号は可変です。 XSL以下、私が試してみました

<?xml version="1.0" encoding="Windows-1252" standalone="no"?> 
<input> 
    <data> 
    <registry DATA1 = "R1 A1 Data" DATA2 = "R1 A2 Data" DATA3 = "R1 A3 Data"/> 
    <registry DATA1 = "R2 A1 Data" DATA2 = "R2 A2 Data" DATA3 = "R2 A3 Data"/> 
    <registry DATA1 = "R3 A1 Data" DATA2 = "R3 A2 Data" DATA3 = "R3 A3 Data"/> 
    <registry DATA1 = "R4 A1 Data" DATA2 = "R4 A2 Data" DATA3 = "R4 A3 Data"/> 
    </data> 
</input> 

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

    <xsl:template match="/"> 
    <xsl:element name="input" > 
    <xsl:element name="data" > 
     <xsl:element name="registry" > 
     <xsl:attribute name="DATA1"> 
      <xsl:value-of select="ECG/R001/A01"/> 
     </xsl:attribute> 
     <xsl:attribute name="DATA2"> 
      <xsl:value-of select="ECG/R001/A02"/> 
     </xsl:attribute> 
     <xsl:attribute name="DATA3"> 
      <xsl:value-of select="ECG/R001/A03"/> 
     </xsl:attribute> 
     </xsl:element> 
     <xsl:element name="registry" > 
     <xsl:attribute name="DATA1"> 
      <xsl:value-of select="ECG/R002/A01"/> 
     </xsl:attribute> 
     <xsl:attribute name="DATA2"> 
      <xsl:value-of select="ECG/R002/A02"/> 
     </xsl:attribute> 
     <xsl:attribute name="DATA3"> 
      <xsl:value-of select="ECG/R002/A03"/> 
     </xsl:attribute> 
     </xsl:element> 
     <xsl:element name="registry" > 
     <xsl:attribute name="DATA1"> 
      <xsl:value-of select="ECG/R003/A01"/> 
     </xsl:attribute> 
     <xsl:attribute name="DATA2"> 
      <xsl:value-of select="ECG/R003/A02"/> 
     </xsl:attribute> 
     <xsl:attribute name="DATA3"> 
      <xsl:value-of select="ECG/R003/A03"/> 
     </xsl:attribute> 
     </xsl:element> 
     <xsl:element name="registry" > 
     <xsl:attribute name="DATA1"> 
      <xsl:value-of select="ECG/R004/A01"/> 
     </xsl:attribute> 
     <xsl:attribute name="DATA2"> 
      <xsl:value-of select="ECG/R004/A02"/> 
     </xsl:attribute> 
     <xsl:attribute name="DATA3"> 
      <xsl:value-of select="ECG/R004/A03"/> 
     </xsl:attribute> 
     </xsl:element> 
    </xsl:element> 
    </xsl:element> 

</xsl:template> 


</xsl:stylesheet> 

私はそれがないことを行うための最善の方法だと思います!タグの数が不明なのでRXXXです。何か案が?私はループサイクルを考えましたが、ここでは不可能と思われます。おかげ

+0

ですから、これで立ち往生している場所を正確に? –

+0

何を試しましたか? –

+0

XSLの使用に問題があります。 RXXX値を取得するためのForループが必要だと考えてください。私はそれをすることができませんでした!ありがとう –

答えて

0

あなたは、単に行うことができませんでした。

XSL 1.0

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

<xsl:template match="/ECG"> 
    <input> 
     <data> 
      <xsl:apply-templates select="*[not(self::R000)][position() &lt;= current()/R000]"/> 
     </data> 
    </input> 
</xsl:template> 

<xsl:template match="*"> 
    <registry DATA1="{A01}" DATA2="{A02}" DATA3="{A03}"/> 
</xsl:template> 

</xsl:stylesheet> 
+0

ニース!!!それでおしまい!!!それを私に説明してもらえますか? –

+0

@SergioDavidRomero説明する必要があるのはどの部分ですか? 'R000 'を除いてECGの子要素であるすべての要素のリストを取得し、' R000'に示された位置でそれを切り捨てるだけです。 –

+0

ニースとクリア!!ありがとう、XQueryを使用しましたか? –

関連する問題