【问题标题】:How to find specific string within a group of like-named elements如何在一组同名元素中查找特定字符串
【发布时间】:2020-05-30 14:41:24
【问题描述】:

对于下面的 XML,如果有多个选举,我如何找到每个员工选择的最新日期。如果所有选举都显示“放弃”或该员工没有选举,则将使用默认值“青铜”。

示例 XML:

<Data>
    <Employee>
            <First_Name>Homer</First_Name>
            <Last_Name>Simpson</<Last_Name>
            <Elections>
                <Election type="Homer Simpson on 01/01/2020 (Gold Membership) (Waive)"/>
            </Elections>
            <Elections>
                <Election type="Homer Simpson on 01/01/2020 (Silver Membership) (Waive)"/>
            </Elections>
    </Employee>
    <Employee>
            <First_Name>Marge</First_Name>
            <Last_Name>Simpson</<Last_Name>
            <Elections>
                <Election type="Marge Simpson on 01/01/2020 (Gold Membership) (Waive)"/>
            </Elections>
            <Elections>
                <Election type="Marge Simpson on 01/03/2020 (Gold Membership) (Elect)"/>
            </Elections>
            <Elections>
                <Election type="Marge Simpson on 01/03/2020 (Silver Membership) (Waive)"/>
            </Elections>
    </Employee>
    <Employee>
            <First_Name>Lisa</First_Name>
            <Last_Name>Simpson</<Last_Name>
            <Elections>
                <Election type="Lisa Simpson on 01/01/2020 (Gold Membership) (Elect)"/>
            </Elections>
            <Elections>
                <Election type="Lisa Simpson on 01/01/2020 (Silver Membership) (Waive)"/>
            </Elections>
    </Employee>
    <Employee>
            <First_Name>Bart</First_Name>
            <Last_Name>Simpson</<Last_Name>
            <Elections>
                <Election type="Bart Simpson on 01/01/2020 (Gold Membership) (Waive)"/>
            </Elections>
            <Elections>
                <Election type="Bart Simpson on 01/01/2020 (Silver Membership) (Waive)"/>
            </Elections>
            <Elections>
                <Election type="Bart Simpson on 01/01/2020 (Bronze Membership) (Elect)"/>
            </Elections>
    </Employee>
    <Employee>
            <First_Name>Maggie</First_Name>
            <Last_Name>Simpson</<Last_Name>
            <Elections>
                <Election type="Lisa Simpson on 01/01/2020 (Silver Membership) (Elect)"/>
            </Elections>
            <Elections>
                <Election type="Lisa Simpson on 01/01/2020 (Gold Membership) (Waive)"/>
            </Elections>
    </Employee>
    <Employee>
            <First_Name>Grandpa</First_Name>
            <Last_Name>Simpson</<Last_Name>
    </Employee>
</Data>

我尝试了一些方法,例如在 Elections/Election 标签上查找字符串“(Gold Membership)(Elect)”和“(Silver Membership)(Elect)”并设置一个变量(如果是)找到了,但是没有用。

期望的输出是:

荷马、辛普森、青铜
玛姬、辛普森、戈尔德
丽莎,辛普森,金
巴特、辛普森、青铜
爷爷,辛普森,西尔弗

【问题讨论】:

  • 1. 您的处理器是否支持 XSLT 2.0? 2. 这里使用的日期格式是什么? 3. 为什么结果是 Grandpa Simpson Silver 而不是默认的青铜?
  • 1.是的,处理器支持 XSLT 2.0。 2. 日期格式为 mm/dd/yyyy。 3.爷爷应该是青铜。那是我的一个错误。

标签: xslt xslt-grouping


【解决方案1】:

这是很多工作。

如果每个员工只有一次标记为Elect 的选举,事情会简单得多。但是你说可以不止一个,而且只需要考虑最新的一个。更糟糕的是,您使用的日期格式不能按原样用于排序。

尝试以下方法:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>

<xsl:template match="/Data">
    <xsl:for-each select="Employee">
        <!-- names -->
        <xsl:value-of select="First_Name" /> 
        <xsl:text>,</xsl:text>
        <xsl:value-of select="Last_Name" /> 
        <xsl:text>,</xsl:text> 
        <!-- membership -->
        <xsl:variable name="valid-elections" select="Elections/Election[contains(@type, '(Elect)')]"/>      
        <xsl:choose>
            <xsl:when test="$valid-elections">
                <xsl:variable name="memberships" as="element()*">
                    <xsl:perform-sort>
                        <!-- sort by reformatted date -->
                        <xsl:sort select="replace(@type, '.*(\d{2})/(\d{2})/(\d{4}).*', '$3$1$2')" order="descending"/>
                        <xsl:sequence select="$valid-elections"/>
                    </xsl:perform-sort>
                </xsl:variable> 
                <!-- extract type from latest membership -->
                <xsl:value-of select="replace($memberships[1]/@type, '.*\((Gold|Silver|Bronze) Membership\).*', '$1')" /> 
            </xsl:when>
            <xsl:otherwise>Bronze</xsl:otherwise>
        </xsl:choose>
        <xsl:text>&#10;</xsl:text>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

演示https://xsltfiddle.liberty-development.net/gWEaSvj

【讨论】:

    猜你喜欢
    • 2016-08-27
    • 1970-01-01
    • 2022-09-28
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    相关资源
    最近更新 更多