移动 XML 个不同的元素
Move XML different elements
我正在尝试根据属性 id
将每个 programme
元素移动到其对应的 channel
元素中。
我尝试手动创建每个元素,但它们没有相同的子元素,因此检查每个元素会很长。
XML :
<tv source-info-url="http://91.121.66.148/">
<channel id="C1.telerama.fr">
<display-name>TF1</display-name>
</channel>
<channel id="C10.telerama.fr">
<display-name>TMC</display-name>
</channel>
<programme start="20111106195500" stop="20111106200000"
showview="20564133" channel="C1.telerama.fr">
<title>Météo</title>
<desc lang="fr">Bulletin météo et prévisions</desc>
<category lang="fr">météo</category>
<length units="minutes">5</length>
<audio>
<stereo>stereo</stereo>
</audio>
</programme>
<programme start="20111110053500" stop="20111110060500"
showview="14730766" channel="C10.telerama.fr">
<sub-title>La stratégie du lapin</sub-title>
<desc lang="fr">Episode : 96/156 - Toujours à la recherche d’un
infaillible moyen de séduction,...</desc>
<credits>
<actor>Marie Chevalier (Sabine)</actor>
</credits>
<category lang="fr">série</category>
<category lang="fr">série humoristique</category>
<length units="minutes">30</length>
</programme>
</tv>
预期结果
<tv source-info-url="http://91.121.66.148/">
<channel id="C1.telerama.fr">
<display-name>TF1</display-name>
<programme start="20111106195500" stop="20111106200000"
showview="20564133" channel="C1.telerama.fr">
<title>Météo</title>
<desc lang="fr">Bulletin météo et prévisions</desc>
<category lang="fr">météo</category>
<length units="minutes">5</length>
<audio>
<stereo>stereo</stereo>
</audio>
</programme>
</channel>
<channel id="C10.telerama.fr">
<display-name>TMC</display-name>
<programme start="20111110053500" stop="20111110060500"
showview="14730766" channel="C10.telerama.fr">
<sub-title>La stratégie du lapin</sub-title>
<desc lang="fr">Episode : 96/156 - Toujours à la recherche d’un
infaillible moyen de séduction,...</desc>
<credits>
<actor>Marie Chevalier (Sabine)</actor>
</credits>
<category lang="fr">série</category>
<category lang="fr">série humoristique</category>
<length units="minutes">30</length>
</programme>
</channel>
</tv>
我的 XSL :
<xsl:template match="/tv">
<tv>
<xsl:for-each select="channel">
<xsl:element name="channel">
<xsl:attribute name = "id">
<xsl:value-of select="@id"/>
</xsl:attribute>
<xsl:element name="display-name">
<xsl:value-of select="display-name"/>
</xsl:element>
</xsl:element>
<!-- Copying programme Elements -->
<xsl:call-template name="programmeChannel">
<xsl:with-param name="channelID" select = "@id"/>
</xsl:call-template>
</xsl:for-each>
</tv>
</xsl:template>
<xsl:template name = "programmeChannel">
<xsl:param name="channelID"/>
<xsl:for-each select="//programme">
<xsl:if test="@channel=$channelID">
<xsl:element name="programme">
<xsl:attribute name="showview"><xsl:value-of select="@showview"/></xsl:attribute>
<xsl:element name="title"><xsl:value-of select="title"/></xsl:element>
<xsl:element name="desc">
<xsl:attribute name="lang"><xsl:value-of select="desc/@lang"/></xsl:attribute>
<xsl:value-of select="title"/>
</xsl:element>
<xsl:element name="category">
<xsl:attribute name="lang"><xsl:value-of select="category/@lang"/></xsl:attribute>
<xsl:value-of select="category"/>
</xsl:element>
<xsl:element name="length">
<xsl:attribute name="units"><xsl:value-of select="length/@units"/></xsl:attribute>
<xsl:value-of select="length"/>
</xsl:element>
<xsl:element name="audio">
<stereo><xsl:value-of select="audio/stereo"/></stereo>
</xsl:element>
</xsl:element>
</xsl:if>
</xsl:for-each>
</xsl:template>
这应该很容易使用 key:
XSLT 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:strip-space elements="*"/>
<xsl:key name="pgm" match="programme" use="@channel" />
<xsl:template match="/tv">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:for-each select="channel">
<xsl:copy>
<xsl:copy-of select="@* | *"/>
<xsl:copy-of select="key('pgm', @id)"/>
</xsl:copy>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
我正在尝试根据属性 id
将每个 programme
元素移动到其对应的 channel
元素中。
我尝试手动创建每个元素,但它们没有相同的子元素,因此检查每个元素会很长。
XML :
<tv source-info-url="http://91.121.66.148/">
<channel id="C1.telerama.fr">
<display-name>TF1</display-name>
</channel>
<channel id="C10.telerama.fr">
<display-name>TMC</display-name>
</channel>
<programme start="20111106195500" stop="20111106200000"
showview="20564133" channel="C1.telerama.fr">
<title>Météo</title>
<desc lang="fr">Bulletin météo et prévisions</desc>
<category lang="fr">météo</category>
<length units="minutes">5</length>
<audio>
<stereo>stereo</stereo>
</audio>
</programme>
<programme start="20111110053500" stop="20111110060500"
showview="14730766" channel="C10.telerama.fr">
<sub-title>La stratégie du lapin</sub-title>
<desc lang="fr">Episode : 96/156 - Toujours à la recherche d’un
infaillible moyen de séduction,...</desc>
<credits>
<actor>Marie Chevalier (Sabine)</actor>
</credits>
<category lang="fr">série</category>
<category lang="fr">série humoristique</category>
<length units="minutes">30</length>
</programme>
</tv>
预期结果
<tv source-info-url="http://91.121.66.148/">
<channel id="C1.telerama.fr">
<display-name>TF1</display-name>
<programme start="20111106195500" stop="20111106200000"
showview="20564133" channel="C1.telerama.fr">
<title>Météo</title>
<desc lang="fr">Bulletin météo et prévisions</desc>
<category lang="fr">météo</category>
<length units="minutes">5</length>
<audio>
<stereo>stereo</stereo>
</audio>
</programme>
</channel>
<channel id="C10.telerama.fr">
<display-name>TMC</display-name>
<programme start="20111110053500" stop="20111110060500"
showview="14730766" channel="C10.telerama.fr">
<sub-title>La stratégie du lapin</sub-title>
<desc lang="fr">Episode : 96/156 - Toujours à la recherche d’un
infaillible moyen de séduction,...</desc>
<credits>
<actor>Marie Chevalier (Sabine)</actor>
</credits>
<category lang="fr">série</category>
<category lang="fr">série humoristique</category>
<length units="minutes">30</length>
</programme>
</channel>
</tv>
我的 XSL :
<xsl:template match="/tv">
<tv>
<xsl:for-each select="channel">
<xsl:element name="channel">
<xsl:attribute name = "id">
<xsl:value-of select="@id"/>
</xsl:attribute>
<xsl:element name="display-name">
<xsl:value-of select="display-name"/>
</xsl:element>
</xsl:element>
<!-- Copying programme Elements -->
<xsl:call-template name="programmeChannel">
<xsl:with-param name="channelID" select = "@id"/>
</xsl:call-template>
</xsl:for-each>
</tv>
</xsl:template>
<xsl:template name = "programmeChannel">
<xsl:param name="channelID"/>
<xsl:for-each select="//programme">
<xsl:if test="@channel=$channelID">
<xsl:element name="programme">
<xsl:attribute name="showview"><xsl:value-of select="@showview"/></xsl:attribute>
<xsl:element name="title"><xsl:value-of select="title"/></xsl:element>
<xsl:element name="desc">
<xsl:attribute name="lang"><xsl:value-of select="desc/@lang"/></xsl:attribute>
<xsl:value-of select="title"/>
</xsl:element>
<xsl:element name="category">
<xsl:attribute name="lang"><xsl:value-of select="category/@lang"/></xsl:attribute>
<xsl:value-of select="category"/>
</xsl:element>
<xsl:element name="length">
<xsl:attribute name="units"><xsl:value-of select="length/@units"/></xsl:attribute>
<xsl:value-of select="length"/>
</xsl:element>
<xsl:element name="audio">
<stereo><xsl:value-of select="audio/stereo"/></stereo>
</xsl:element>
</xsl:element>
</xsl:if>
</xsl:for-each>
</xsl:template>
这应该很容易使用 key:
XSLT 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:strip-space elements="*"/>
<xsl:key name="pgm" match="programme" use="@channel" />
<xsl:template match="/tv">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:for-each select="channel">
<xsl:copy>
<xsl:copy-of select="@* | *"/>
<xsl:copy-of select="key('pgm', @id)"/>
</xsl:copy>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>