私はこの入力ファイルを持っています:
<root>
<library id="L1">
<shelf1 id="1">
<book id="1" action="borrow">
<attributes>
<user>John</user>
</attributes>
<other1>y</other1>
</book>
<book id="1" action="extend">
<attributes>
<user>Woo</user>
<length>3</length>
</attributes>
<other2>y</other2>
</book>
<book id="1" action="extend">
<attributes>
<length>2</length>
<condition>ok</condition>
</attributes>
<other3>y</other3>
</book>
<book id="2" action="borrow">...</book>
</shelf1>
<shelf2>...</shelf2>
</library>
</root>
期待される出力:
<root>
<library id="L1">
<shelf1 id="1">
<book id="1" action="borrow">
<attributes>
<user>Woo</user>
<length>2</length>
<condition>ok</condition>
</attributes>
<other1>y</other1>
<other2>y</other2>
<other3>y</other3>
</book>
<book id="2" action="borrow">...</book>
</shelf1>
<shelf2>...</shelf2>
</library>
</root>
私のXSL:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="library/*/*[1]">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<attributes>
<xsl:for-each-group select="attributes/*" group-by="name()">
<xsl:sort select="current-grouping-key()"/>
<xsl:apply-templates select="."/>
</xsl:for-each-group>
</attributes>
<xsl:apply-templates select="*[not(self::attributes)]"/>
</xsl:copy>
</xsl:template>
<xsl:template match=
"library/*/*
[@action='extend' and following-sibling::*[1][@action='extend']
or preceding-sibling::*[@action='borrow']]"/>
</xsl:stylesheet>
すべてのノードに対して、action=borrow
その後に1つ以上のノードが続きますaction=extend
- を使用してノードにマージします
action=borrow
。 attributes
最新の値を持つ兄弟からのすべての一意の属性を持つように、子をマージします。- 他の子供は変更しないでください
XSLT2.0を使用してこの変換を修正する方法を教えてください。
どうもありがとう。
よろしく、ジョン