根据某些条件选择已排序的xml节点

时间:2013-07-08 18:12:06

标签: xslt-1.0

我有这样的样本xml:

User
    name   A
    Id     8

User
    name   B
    Id     5

User
    name   C
    Id     16

User
    name   D
    Id     10
...

如果输入是

,这就是我所期望的
  • 仅限A - >输出应该是A.

  • 仅限B - >输出应该是B.

  • 仅限A和B - >输出应该是B.

  • A和B以外的任何用户 - >输出应该是id最低的用户的名称。

  • A,B和其他用户 - > ID最低的用户,A和B除外。

我尝试了以下模板的不同变体

<xsl:template name="getPriorityName">
        <xsl:for-each select="//*[local-name()='User']">
            <xsl:sort select="./*[local-name()='Id']" data-type="number"/>  
            <xsl:variable name="name">
                <xsl:value-of select="./*[local-name()='name']"/>
            </xsl:variable> 
            <xsl:choose>
                <xsl:when test="$name!='A' and $name!='B'">
                    <xsl:if test="position()=1">
                        <xsl:value-of select="$name"/>
                    </xsl:if>
                </xsl:when>
            </xsl:choose>       
        </xsl:for-each>
</xsl:template>

但是因为我无法使用for-each的俱乐部名称条件,所以当A和B在输入中时它不起作用

谢谢Jirka :) 我稍微修改了tempalte,现在看起来没问题了:

<?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="/Users">
        <xsl:variable name="UsersCount" select="count(User)" />
        <xsl:variable name="UsersExceptAB" select="User[Name != 'A' and Name !='B']" />
        <xsl:variable name="UsersAB" select="User[Name = 'A' or Name ='B']" />
        <xsl:variable name="UserInABWithMinimumId" select="$UsersAB[not($UsersAB/Id  &lt; ./Id)]" />
        <xsl:variable name="UserExceptABWithMinimumId" select="$UsersExceptAB[not($UsersExceptAB/Id  &lt; ./Id)]" />

        <result>        
            <xsl:choose>
                <xsl:when test="$UsersExceptAB">
                    <xsl:copy-of select="$UserExceptABWithMinimumId" />
                </xsl:when>
                <xsl:when test="$UsersAB">
                    <xsl:copy-of select="$UserInABWithMinimumId" />
                </xsl:when>
                <xsl:otherwise>
                    <xsl:comment>Oops, something is wrong.</xsl:comment>
                </xsl:otherwise>
            </xsl:choose>
        </result>
    </xsl:template>

</xsl:stylesheet>

有没有办法可以将名称分配给变量;让我们说;我可以在以后使用的priorityName,我的应用程序中有一些基于此priorityName的其他逻辑。我试图从节点访问名称,但由于我们最终拥有的是一个节点集(总是大小为1 - UserInABWithMinimumId或UserExceptABWithMinimumId)。这就是我的尝试:

<xsl:variable name="priorityName">
            <xsl:choose>
                <xsl:when test="$UsersExceptAB">
                    <xsl:value-of select="$UserExceptABWithMinimumId/User/Name" />
                </xsl:when>
                <xsl:when test="$UsersAB">
                    <xsl:value-of select="$UserInABWithMinimumId/User/Name" />
                </xsl:when>
                <xsl:otherwise>
                    <xsl:comment>Oops, something is wrong.</xsl:comment>
                </xsl:otherwise>
            </xsl:choose>
            </xsl:variable>

感谢!!!

1 个答案:

答案 0 :(得分:0)

您可以尝试使用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="/Users">
        <xsl:variable name="UsersCount" select="count(User)" />
        <xsl:variable name="UsersExceptAB" select="User[Name != 'A' and Name !='B']" />
        <xsl:variable name="UsersExceptABWithMinimumId" select="$UsersExceptAB[not($UsersExceptAB/Id  &lt; ./Id)]" />

        <result>        
            <xsl:choose>
                <!-- There exists some User with other name than A or B-->
                <xsl:when test="$UsersExceptAB">
                    <xsl:copy-of select="$UsersExceptABWithMinimumId" />
                </xsl:when>
                <!-- There exists no User with other than A or B but there is a User with name B -->
                <xsl:when test="User[Name = 'B']">
                    <xsl:copy-of select="User[Name = 'B']" />
                </xsl:when>
                <!-- There is no User with other than A -->
                <xsl:when test="User[Name='A']">
                    <xsl:copy-of select="User[Name = 'A']" />
                </xsl:when>
                <!-- Probably there is no User -->
                <xsl:otherwise>
                    <xsl:comment>Oops, something is wrong.</xsl:comment>
                </xsl:otherwise>
            </xsl:choose>
        </result>
    </xsl:template>

</xsl:stylesheet>

当我使用此输入时

<?xml version="1.0" encoding="UTF-8"?>
<Users>
    <User>
        <Name>A</Name>
        <Id>8</Id>
    </User>
    <User>
        <Name>B</Name>
        <Id>9</Id>
    </User>
    <User>
        <Name>C</Name>
        <Id>6</Id>
    </User>
    <User>
        <Name>D</Name>
        <Id>10</Id>
    </User>
        <User>
        <Name>E</Name>
        <Id>11</Id>
    </User>
</Users>

(并为测试目的评论了不同的用户)它返回了我想要的输出。