我有这样的示例xml:
User
name A
Id 8
User
name B
Id 5
User
name C
Id 16
User
name D
Id 10
...
这就是我所期望的,如果输入是
唯一的-->输出应该是A.
仅B-->输出应为B。
仅A和B-->输出应为B。
除A和B-->输出之外的任何用户都应该是id最低的用户的名称。
A、 B和除A和B之外id最低的其他用户-->用户。
我已经尝试了以下模板的不同变体
<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>
但由于我无法为每个俱乐部命名条件,当A和B在输入中时,它不起作用
谢谢Jirka:)我稍微修改了一下温度,现在看起来还可以:
<?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 < ./Id)]" />
<xsl:variable name="UserExceptABWithMinimumId" select="$UsersExceptAB[not($UsersExceptAB/Id < ./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>
谢谢!!!
您可以尝试以下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 < ./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>
(并评论了不同的用户用于测试目的)它返回了我想要的输出。