gpt4 book ai didi

xslt 跟随组

转载 作者:行者123 更新时间:2023-12-04 06:16:52 26 4
gpt4 key购买 nike

旧源 XML:

<Employees>
<Person>
<FirstName>Joy</FirstName>
<IsManager>N</IsManager>
</Person>
<Person>
<FirstName>Joyce</FirstName>
<IsManager>N</IsManager>
</Person>
<Person>
<FirstName>Joe</FirstName>
<IsManager>Y</IsManager>
</Person>...
</Employees>

新的源 XML:
<Employees>
<Person>
<FirstName>Joy</FirstName>
<DetailsArray>
<Details1>
<IsManager>N</IsManager>
<IsSuperviser>N</IsSuperviser>
</Details1>
<Details2>
<IsManager>N</IsManager>
<IsSuperviser>N</IsSuperviser>
</Details2>
</DetailsArray>
</Person>
<Person>
<FirstName>Joyce</FirstName>
<DetailsArray>
<Details1>
<IsManager>N</IsManager>
<IsSuperviser>N</IsSuperviser>
</Details1>
<Details2>
<IsManager>N</IsManager>
<IsSuperviser>N</IsSuperviser>
</Details2>
</DetailsArray>
</Person>
<Person>
<FirstName>Joe</FirstName>
<DetailsArray>
<Details1>
<IsManager>N</IsManager>
<IsSuperviser>N</IsSuperviser>
</Details1>
<Details2>
<IsManager>Y</IsManager>
<IsSuperviser>N</IsSuperviser>
</Details2>
</DetailsArray>
</Person>...
</Employees>

输出应该是:
    <Names>
<Name num='1'>Joe</Name>
<Name num='2'>Joy</Name>
<Name num='3'>Joyce</Name>
....
</Names>

与以前的 XML 相比,此源 XML 有一些调整。这里的新条件是“此人可能链接到 2 个项目或 2 个任务”,因此我需要输出从 IsManager='Y' 的人开始,即使 IsManager 在 DetailsArray 的 Details2 标签中为 'y'。输出不应有重复的名称。因为假设如果我们排序名称将重复..

感谢之前的回答。。

最佳答案

编辑 .正如 lwburk 指出的,这个答案的原始解决方案只是按 IsManager 对节点进行排序。 .

这是一个解决方案,它找到第一个经理,将其打印出来,然后循环遍历其余的人(如果需要,循环回到开头)。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="Employees">

<xsl:variable name="position" select="count(Person) - count(Person/IsManager[. = 'Y'][1]/../following-sibling::*)" />

<xsl:call-template name="person">
<xsl:with-param name="name" select="Person/IsManager[. = 'Y'][1]/../FirstName" />
<xsl:with-param name="position" select="'1'" />
</xsl:call-template>

<xsl:for-each select="Person[position() &gt; $position]">
<xsl:call-template name="person" />
</xsl:for-each>

<xsl:for-each select="Person[position() &lt; $position]">
<xsl:call-template name="person" />
</xsl:for-each>
</xsl:template>

<xsl:template name="person">
<xsl:param name="name" select="FirstName" />
<xsl:param name="position" select="position() + 1" />

<Name>
<xsl:attribute name="num"><xsl:value-of select="$position" /></xsl:attribute>
<xsl:value-of select="$name" />
</Name>
</xsl:template>

</xsl:stylesheet>

旧答案 .

我不确定您的问题,但我认为您希望以 IsManager = Y 开头的人获得所有姓名。 .您可以使用 <xsl:sort>IsManager值(value)。不要忘记在属性“order”中指定“descending”(否则, IsManager = Y 的人将是最后一个)。

我写了一个适用于您的输入数据的示例:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="Employees">
<xsl:for-each select="Person">
<xsl:sort select="IsManager" order="descending" />

<Name>
<xsl:attribute name="num">
<xsl:value-of select="position()" />
</xsl:attribute>
<xsl:value-of select="FirstName" />

</Name>

</xsl:for-each>
</xsl:template>

</xsl:stylesheet>

关于xslt 跟随组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7125777/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com