Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Variables XSLT:增量变量和参数赋值_Variables_Xslt - Fatal编程技术网

Variables XSLT:增量变量和参数赋值

Variables XSLT:增量变量和参数赋值,variables,xslt,Variables,Xslt,嗨 我需要下面的xml <Data> <Employees> <Employee> <EmployeeName>Ram</EmployeeName> <EmployeeID>123</EmployeeID> <Gender>M</Gender> </Employee>

我需要下面的xml

<Data>
    <Employees>
        <Employee>
            <EmployeeName>Ram</EmployeeName>
            <EmployeeID>123</EmployeeID>
            <Gender>M</Gender>
        </Employee>
        <Employee>
            <EmployeeName>Helen</EmployeeName>
            <EmployeeID>432</EmployeeID>
            <Gender>F</Gender>
        </Employee>
        <Employee>
            <EmployeeName>Dinesh</EmployeeName>
            <EmployeeID>321</EmployeeID>
            <Gender>M</Gender>
        </Employee>
    </Employees>
</Data>

内存
123
M
海伦
432
F
迪内希
321
M
转换到这个

<?xml version="1.0" encoding="UTF-8"?>
<Employees>
    <Employee Gender="Male" Current="true" index="1">
        <Name>Ram</Name>
    </Employee>
    <Employee Gender="Male" Current="false" index="2">
        <Name>Dinesh</Name>
    </Employee>
    <Employee Gender="Female" Current="false" index="3">
        <Name>Helen</Name>
    </Employee>
</Employees>

内存
迪内希
海伦
我使用的样式表如下所示

<?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="Data">
        <Employees>

                <xsl:for-each select="Employees/Employee[Gender = 'M']">
                <Employee Gender="Male">
                    <Name>
                        <xsl:value-of select="EmployeeName"/>
                    </Name>
                                </Employee>
                </xsl:for-each>
                <xsl:for-each select="Employees/Employee[Gender = 'F']">
                <Employee Gender="Female">
                    <Name>
                        <xsl:value-of select="EmployeeName"/>
                    </Name>
                                </Employee>
                </xsl:for-each>


        </Employees>
    </xsl:template>
</xsl:stylesheet>

我尝试使用了几个示例,例如,但似乎没有任何结果。有人能帮我吗?这只是我用来解释这个问题的一个示例代码

或者更具体地说,


“当前”只需要在第一个员工节点中设置。另一方面,索引应该在所有节点上。

我会为每个节点使用一个
(或者更可能是
应用模板,但我会遵循您当前的结构),这样您就可以使用
position()
生成索引。为了将所有的
男性员工排在
女性员工之后,只需将每个
性别的降序排列就足够了(因为字母表中的“M”晚于“F”):


真的
假的

我会为每一个
使用一个
(或者更可能是
应用模板
,但我会遵循您当前的结构),这样您就可以使用
position()
生成索引。为了将所有的
男性员工排在
女性员工之后,只需将每个
性别的降序排列就足够了(因为字母表中的“M”晚于“F”):


真的
假的

我会为每一个
使用一个
(或者更可能是
应用模板
,但我会遵循您当前的结构),这样您就可以使用
position()
生成索引。为了将所有的
男性员工排在
女性员工之后,只需将每个
性别的降序排列就足够了(因为字母表中的“M”晚于“F”):


真的
假的

我会为每一个
使用一个
(或者更可能是
应用模板
,但我会遵循您当前的结构),这样您就可以使用
position()
生成索引。为了将所有的
男性员工排在
女性员工之后,只需将每个
性别的降序排列就足够了(因为字母表中的“M”晚于“F”):


真的
假的
您可以使用
位置()
确定元素在其父元素下的位置。我还倾向于重构模板,以支持
apply templates
,并消除重复的男性和女性员工映射

<?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="Data">
      <Employees>
         <xsl:apply-templates select="Employees/Employee">
            <xsl:sort select="Gender" order="descending" />
         </xsl:apply-templates>
      </Employees>
   </xsl:template>

   <xsl:template match="Employee">
      <xsl:variable name="gender">
         <xsl:choose>
            <xsl:when test="Gender='M'">Male</xsl:when>
            <xsl:when test="Gender='F'">Female</xsl:when>
            <xsl:otherwise>Unknown</xsl:otherwise>
         </xsl:choose>
      </xsl:variable>
      <xsl:variable name="current">
         <xsl:choose>
            <xsl:when test="position() = 1">true</xsl:when>
            <xsl:otherwise>false</xsl:otherwise>
         </xsl:choose>
      </xsl:variable>
      <Employee Gender="{$gender}" Current="{$current}" index="{position()}">
            <Name>
               <xsl:value-of select="EmployeeName"/>
            </Name>
         </Employee>
   </xsl:template>
</xsl:stylesheet>

男性
女性
不为人知
真的
假的
按照@Ians解决方案进行编辑,我添加了排序和
Current
属性。但是,我不确定复杂的是什么-也许我错过了其他东西?

您可以使用
position()
确定元素在其父元素下的位置。我还倾向于重构模板,以支持
apply templates
,并消除重复的男性和女性员工映射

<?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="Data">
      <Employees>
         <xsl:apply-templates select="Employees/Employee">
            <xsl:sort select="Gender" order="descending" />
         </xsl:apply-templates>
      </Employees>
   </xsl:template>

   <xsl:template match="Employee">
      <xsl:variable name="gender">
         <xsl:choose>
            <xsl:when test="Gender='M'">Male</xsl:when>
            <xsl:when test="Gender='F'">Female</xsl:when>
            <xsl:otherwise>Unknown</xsl:otherwise>
         </xsl:choose>
      </xsl:variable>
      <xsl:variable name="current">
         <xsl:choose>
            <xsl:when test="position() = 1">true</xsl:when>
            <xsl:otherwise>false</xsl:otherwise>
         </xsl:choose>
      </xsl:variable>
      <Employee Gender="{$gender}" Current="{$current}" index="{position()}">
            <Name>
               <xsl:value-of select="EmployeeName"/>
            </Name>
         </Employee>
   </xsl:template>
</xsl:stylesheet>

男性
女性
不为人知
真的
假的
按照@Ians解决方案进行编辑,我添加了排序和
Current
属性。但是,我不确定复杂的是什么-也许我错过了其他东西?

您可以使用
position()
确定元素在其父元素下的位置。我还倾向于重构模板,以支持