这是我的xml的简单版本:
<?xml version="1.0" encoding="UTF-8"?>
<level1>
<d1>
<date type="inclusive">1912-1987</date>
<date type="bulk">1943-1987</date>
</d1>
<d1>
<date type="inclusive">1962-1983</date>
<date type="bulk">1962-1983</date>
</d1>
</level1>
我正在尝试编写一个脚本来比较两个日期类型名称。如果bulk =包含,我希望它仅包含并删除批量。如果批量和包容性不同,则我希望转换保持原样。
这是我目前的转换方式
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml" indent="yes" encoding="utf-8"/>
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
<xsl:variable name="inclusiveDate" select="//date[@type = 'inclusive']/text()"/>
<xsl:variable name="bulkDate" select="//date[@type = 'bulk']/text()"/>
<xsl:template match="//date[@type = 'bulk']">
<xsl:choose>
<xsl:when test="$bulkDate = $inclusiveDate">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:copy-of select="$inclusiveDate[not($bulkDate)]"/>
</xsl:copy>
</xsl:when>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
这就是给我的:
<?xml version="1.0" encoding="utf-8"?>
<level1>
<d1>
<date type="inclusive">1912-1987</date>
<date type="bulk"/>
</d1>
<d1>
<date type="inclusive">1962-1983</date>
<date type="bulk"/>
</d1>
</level1>
我需要它来摆脱
<date type="bulk"/>
如果与包含日期相同,则为完整。并且不要删除批量日期(如果它们不同),就这样:
<d1>
<date type="inclusive">1912-1987</date>
<date type="bulk">1943-1987</date>
</d1>
这时我已经尝试了很多不同的东西。
答案 0 :(得分:1)
我认为首先您要匹配具有匹配的d1
元素的date
元素:
d1[date[@type='bulk'] = date[@type='inclusive']]
然后匹配批量发布日期:
date[@type='bulk']
这可以全部组合为一个匹配项:
d1[date[@type='bulk'] = date[@type='inclusive']]/date[@type='bulk']
这与身份模板一起,应该为您提供所需的输出...
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template
match="d1[date[@type='bulk'] = date[@type='inclusive']]/date[@type='bulk']"/>
</xsl:stylesheet>