XSLT何时,复制和删除

时间:2018-08-08 20:28:48

标签: xml xslt

这是我的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>

这时我已经尝试了很多不同的东西。

1 个答案:

答案 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>

正在工作的小提琴:http://xsltfiddle.liberty-development.net/94hvTzs

相关问题