我正在尝试将兄弟数据分组到XML文件中.
鉴于:
<?xml version="1.0" encoding="UTF-8"?>
<data>
<competition>
<timeline>10:00</timeline>
<fixture>team a v team b</fixture>
<fixture>team c v team d</fixture>
<timeline>12:00</timeline>
<fixture>team e v team f</fixture>
<timeline>16:00</timeline>
<fixture>team g v team h</fixture>
<fixture>team i v team j</fixture>
<fixture>team k v team l</fixture>
</competition>
</data>
Run Code Online (Sandbox Code Playgroud)
我想要产生:
<?xml version="1.0" encoding="UTF-8"?>
<data>
<competition>
<timeline time="10:00">
<fixture>team a v team b</fixture>
<fixture>team c v team d</fixture>
</timeline>
<timeline time="12:00">
<fixture>team e v team f</fixture>
</timeline>
<timeline time="16:00">
<fixture>team g v team h</fixture>
<fixture>team i v team j</fixture>
<fixture>team k v team l</fixture>
</timeline>
</competition>
</data>
Run Code Online (Sandbox Code Playgroud)
我使用以下XSLT:
<?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="competition" >
<xsl:apply-templates select="timeline" />
</xsl:template>
<xsl:template match="timeline">
<timeline>
<xsl:attribute name="time" >
<xsl:value-of select="." />
</xsl:attribute>
<xsl:apply-templates select="following-sibling::*" mode="copy"/>
</timeline>
</xsl:template>
<xsl:template match="fixture" mode="copy">
<fixture>
<xsl:value-of select="." />
</fixture>
</xsl:template>
<xsl:template match="timeline" mode="copy">
<xsl:apply-templates select="following-sibling::*" mode="null" />
</xsl:template>
<xsl:template match="*" mode="null">
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
我的问题是它到达下一个时间轴时没有停止处理夹具节点
Tom*_*lak 10
当以下情况属实时(我认为是这样),这很容易做到:
<timeline>s <competition>都是独一无二的<fixture>给定之后的s 才<timeline>属于它<fixture>没有一个<timeline>元素在它之前是没有的这个XSLT 1.0解决方案:
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<xsl:key name="kFixture"
match="fixture"
use="generate-id(preceding-sibling::timeline[1])"
/>
<xsl:template match="data">
<xsl:copy>
<xsl:apply-templates select="competition" />
</xsl:copy>
</xsl:template>
<xsl:template match="competition">
<xsl:copy>
<xsl:apply-templates select="timeline" />
</xsl:copy>
</xsl:template>
<xsl:template match="timeline">
<xsl:copy>
<xsl:attribute name="time">
<xsl:value-of select="." />
</xsl:attribute>
<xsl:copy-of select="key('kFixture', generate-id())" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
生产:
<data>
<competition>
<timeline time="10:00">
<fixture>team a v team b</fixture>
<fixture>team c v team d</fixture>
</timeline>
<timeline time="12:00">
<fixture>team e v team f</fixture>
</timeline>
<timeline time="16:00">
<fixture>team g v team h</fixture>
<fixture>team i v team j</fixture>
<fixture>team k v team l</fixture>
</timeline>
</competition>
</data>
Run Code Online (Sandbox Code Playgroud)
注意使用a <xsl:key>来匹配<fixture>给定的所有s("前面跟着")<timeline>.
一个稍短但不太明显的解决方案是修改后的身份变换:
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<xsl:key name="kFixture"
match="fixture"
use="generate-id(preceding-sibling::timeline[1])"
/>
<xsl:template match="* | @*">
<xsl:copy>
<xsl:apply-templates select="*[not(self::fixture)] | @*" />
</xsl:copy>
</xsl:template>
<xsl:template match="timeline">
<xsl:copy>
<xsl:attribute name="time">
<xsl:value-of select="." />
</xsl:attribute>
<xsl:copy-of select="key('kFixture', generate-id())" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)