各料理のすべての条件と測定値を組み合わせるには、次をどのように変換しますか? 繰り返し子要素を組み合わせるのに苦労しています。
<?xml version="1.0" encoding="UTF-8"?>
<Test>
<Experiment id='1'>
<Dish1>
<Conditions pressure='x' temp='y'/>
<Measurement timeStamp='8am' reading='y'/>
</Dish1>
<Dish2>
<Conditions pressure='x' temp='y'/>
<Measurement timeStamp='8am' reading='y'/>
</Dish2>
<Dish1>
<Conditions pressure='x' temp='y'/>
<Measurement timeStamp='2pm' reading='y'/>
</Dish1>
<Dish2>
<Conditions pressure='x' temp='y'/>
<Measurement timeStamp='2pm' reading='y'/>
</Dish2>
</Experiment>
<Experiment id='2'>
<Dish1>
<Conditions pressure='x' temp='y'/>
<Measurement timeStamp='9am' reading='y'/>
</Dish1>
</Experiment>
<Experiment id='2'>
<Dish1>
...
</Test>
望ましい結果:
<?xml version="1.0" encoding="UTF-8"?>
<Test>
<Experiment id='1'>
<Dish1>
<Observation pressure='x' temp='y' timeStamp='8am' reading='y'/>
<Observation pressure='x' temp='y' timeStamp='2pm' reading='y'/>
</Dish1>
<Dish2>
<Observation pressure='x' temp='y' timeStamp='8am' reading='y'/>
<Observation pressure='x' temp='y' timeStamp='2pm' reading='y'/>
</Dish2>
</Experiment>
<Experiment id='2'>
<Dish1>
<Observation pressure='x' temp='y' timeStamp='9am' reading='y'/>
...
よろしくお願いします!
これが私がこれまでに試したことです:
<?xml version="1.0" encoding="UTF-8"?>
<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="Experiment">
<xsl:copy>
<xsl:for-each select="Dish1">
<xsl:element name="Observation">
<xsl:attribute name="pressure"><xsl:value-of select="Conditions/@pressure"/></xsl:attribute>
<xsl:attribute name="temp"><xsl:value-of select="Conditions/@temp"/></xsl:attribute>
<xsl:attribute name="TimeStamp"><xsl:value-of select="Measurement/@TimeStamp"/></xsl:attribute>
<xsl:attribute name="reading"><xsl:value-of select="Measurement/@reading"/></xsl:attribute>
</xsl:element>
</xsl:for-each>
</xsl:copy>
</xsl:template>
<!-- copy everthing not covered above-->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
失敗した試みを書き留めているうちに、上記の変換を思いつきました。動作しているようですが、出力を検証する必要があります。提案/改善をいただければ幸いです。ありがとうございました。
...私の変換は、最初の実験でのみ機能します。追加すると:
<xsl:template match="Experiment">
<xsl:copy>
<xsl:for-each select="Dish2">
<xsl:element name="Observation">
<xsl:attribute name="pressure"><xsl:value-of select="Conditions/@pressure"/></xsl:attribute>
<xsl:attribute name="temp"><xsl:value-of select="Conditions/@temp"/></xsl:attribute>
<xsl:attribute name="TimeStamp"><xsl:value-of select="Measurement/@TimeStamp"/></xsl:attribute>
<xsl:attribute name="reading"><xsl:value-of select="Measurement/@reading"/></xsl:attribute>
</xsl:element>
</xsl:for-each>
</xsl:copy>
</xsl:template>
...Dish2 要素が見つかりません。
Ian Roberts に感謝します。失敗した試行を書き留めてもらうことで、アイデアが生まれ、以下の実用的なソリューションにつながりました。
<?xml version="1.0" encoding="UTF-8"?>
<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="Experiment">
<xsl:copy>
<xsl:for-each select="Dish1">
<xsl:element name="Observation">
<xsl:attribute name="pressure"><xsl:value-of select="Conditions/@pressure"/></xsl:attribute>
<xsl:attribute name="temp"><xsl:value-of select="Conditions/@temp"/></xsl:attribute>
<xsl:attribute name="TimeStamp"><xsl:value-of select="Measurement/@TimeStamp"/></xsl:attribute>
<xsl:attribute name="reading"><xsl:value-of select="Measurement/@reading"/></xsl:attribute>
</xsl:element>
</xsl:for-each>
<xsl:for-each select="Dish2">
<xsl:element name="Observation">
<xsl:attribute name="pressure"><xsl:value-of select="Conditions/@pressure"/></xsl:attribute>
<xsl:attribute name="temp"><xsl:value-of select="Conditions/@temp"/></xsl:attribute>
<xsl:attribute name="TimeStamp"><xsl:value-of select="Measurement/@TimeStamp"/></xsl:attribute>
<xsl:attribute name="reading"><xsl:value-of select="Measurement/@reading"/></xsl:attribute>
</xsl:element>
</xsl:for-each>
</xsl:copy>
</xsl:template>
<!-- copy everthing not covered above-->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>