Xslt XSl——需要转换方面的帮助吗

Xslt XSl——需要转换方面的帮助吗,xslt,select,tags,repeat,Xslt,Select,Tags,Repeat,我是XSLT新手,正在尝试解决以下转换 我有一个XML,看起来像这样 <Groups> <Group> <GroupSelector>52</GroupSelector> <GroupDescription>Group 52</GroupDescription> <GroupValue>ABCD</GroupValue> </Group> <Group&g

我是XSLT新手,正在尝试解决以下转换

我有一个XML,看起来像这样

<Groups>
 <Group>
  <GroupSelector>52</GroupSelector> 
  <GroupDescription>Group 52</GroupDescription> 
    <GroupValue>ABCD</GroupValue> 
 </Group>
 <Group>
  <GroupSelector>27</GroupSelector> 
  <GroupDescription>Group 27</GroupDescription> 
  <GroupValue>PQRS</GroupValue> 
 </Group>
 <Group>
  <GroupSelector>20</GroupSelector> 
  <GroupDescription>Group 20</GroupDescription> 
  <GroupValue>XYZA</GroupValue> 
 </Group>
 <Group>
  <GroupSelector>15</GroupSelector> 
  <GroupDescription>Group 15</GroupDescription> 
  <GroupValue>MNOP</GroupValue> 
 </Group>
</Groups>

52
第52组
ABCD
27
第27组
PQRS
20
第20组
XYZA
15
第15组
MNOP
可能有0到n个“组”

我试图应用XSLT来查找“GroupSelector”值为20的“Group”,并创建如下输出:

<GroupSelection ElementName="FoundGroup" Missing="false">20</GroupSelection>
<GroupSelection ElementName="GroupDes" Missing="false">Group 20</GroupSelection>
<GroupSelection ElementName="GroupVal" Missing="false">XYZA</GroupSelection>
20
第20组
XYZA
如果n'组中没有一个具有值为20的'GroupSelector',则输出应如此

<GroupSelection ElementName="FoundGroup" Missing="true"/>
<GroupSelection ElementName="GroupDes" Missing="true"/>
<GroupSelection ElementName="GroupVal" Missing="true"/>

请帮忙。提前谢谢

Lola

这个简单(简短,只有一个模板,没有模式,没有轴)和强大(参数化以使用任何可能的组Id)转换

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:param name="pGroupId" select="'20'"/>

 <xsl:variable name="vGroup" select=
     "/*/Group[GroupSelector=$pGroupId]"/>

 <xsl:template match="/">
     <GroupSelection ElementName="FoundGroup"
                     Missing="{not($vGroup)}">
        <xsl:apply-templates select="$vGroup/GroupSelector"/>
     </GroupSelection>
     <GroupSelection ElementName="GroupDes"
                Missing="{not($vGroup)}">
        <xsl:apply-templates select="$vGroup/GroupDescription"/>
     </GroupSelection>
     <GroupSelection ElementName="GroupVal"
                     Missing="{not($vGroup)}">
        <xsl:apply-templates select="$vGroup/GroupValue"/>
     </GroupSelection>
 </xsl:template>
</xsl:stylesheet>
<Groups>
 <Group>
  <GroupSelector>52</GroupSelector>
  <GroupDescription>Group 52</GroupDescription>
    <GroupValue>ABCD</GroupValue>
 </Group>
 <Group>
  <GroupSelector>27</GroupSelector>
  <GroupDescription>Group 27</GroupDescription>
  <GroupValue>PQRS</GroupValue>
 </Group>
 <Group>
  <GroupSelector>20</GroupSelector>
  <GroupDescription>Group 20</GroupDescription>
  <GroupValue>XYZA</GroupValue>
 </Group>
 <Group>
  <GroupSelector>15</GroupSelector>
  <GroupDescription>Group 15</GroupDescription>
  <GroupValue>MNOP</GroupValue>
 </Group>
</Groups>
<GroupSelection ElementName="FoundGroup" Missing="false">20</GroupSelection>
<GroupSelection ElementName="GroupDes" Missing="false">Group 20</GroupSelection>
<GroupSelection ElementName="GroupVal" Missing="false">XYZA</GroupSelection>
  <GroupSelector>20</GroupSelector>
  <GroupSelector>21</GroupSelector>
<GroupSelection ElementName="FoundGroup" Missing="true"/>
<GroupSelection ElementName="GroupDes" Missing="true"/>
<GroupSelection ElementName="GroupVal" Missing="true"/>

应用于提供的XML文档时

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:param name="pGroupId" select="'20'"/>

 <xsl:variable name="vGroup" select=
     "/*/Group[GroupSelector=$pGroupId]"/>

 <xsl:template match="/">
     <GroupSelection ElementName="FoundGroup"
                     Missing="{not($vGroup)}">
        <xsl:apply-templates select="$vGroup/GroupSelector"/>
     </GroupSelection>
     <GroupSelection ElementName="GroupDes"
                Missing="{not($vGroup)}">
        <xsl:apply-templates select="$vGroup/GroupDescription"/>
     </GroupSelection>
     <GroupSelection ElementName="GroupVal"
                     Missing="{not($vGroup)}">
        <xsl:apply-templates select="$vGroup/GroupValue"/>
     </GroupSelection>
 </xsl:template>
</xsl:stylesheet>
<Groups>
 <Group>
  <GroupSelector>52</GroupSelector>
  <GroupDescription>Group 52</GroupDescription>
    <GroupValue>ABCD</GroupValue>
 </Group>
 <Group>
  <GroupSelector>27</GroupSelector>
  <GroupDescription>Group 27</GroupDescription>
  <GroupValue>PQRS</GroupValue>
 </Group>
 <Group>
  <GroupSelector>20</GroupSelector>
  <GroupDescription>Group 20</GroupDescription>
  <GroupValue>XYZA</GroupValue>
 </Group>
 <Group>
  <GroupSelector>15</GroupSelector>
  <GroupDescription>Group 15</GroupDescription>
  <GroupValue>MNOP</GroupValue>
 </Group>
</Groups>
<GroupSelection ElementName="FoundGroup" Missing="false">20</GroupSelection>
<GroupSelection ElementName="GroupDes" Missing="false">Group 20</GroupSelection>
<GroupSelection ElementName="GroupVal" Missing="false">XYZA</GroupSelection>
  <GroupSelector>20</GroupSelector>
  <GroupSelector>21</GroupSelector>
<GroupSelection ElementName="FoundGroup" Missing="true"/>
<GroupSelection ElementName="GroupDes" Missing="true"/>
<GroupSelection ElementName="GroupVal" Missing="true"/>

52
第52组
ABCD
27
第27组
PQRS
20
第20组
XYZA
15
第15组
MNOP
生成所需的正确结果

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:param name="pGroupId" select="'20'"/>

 <xsl:variable name="vGroup" select=
     "/*/Group[GroupSelector=$pGroupId]"/>

 <xsl:template match="/">
     <GroupSelection ElementName="FoundGroup"
                     Missing="{not($vGroup)}">
        <xsl:apply-templates select="$vGroup/GroupSelector"/>
     </GroupSelection>
     <GroupSelection ElementName="GroupDes"
                Missing="{not($vGroup)}">
        <xsl:apply-templates select="$vGroup/GroupDescription"/>
     </GroupSelection>
     <GroupSelection ElementName="GroupVal"
                     Missing="{not($vGroup)}">
        <xsl:apply-templates select="$vGroup/GroupValue"/>
     </GroupSelection>
 </xsl:template>
</xsl:stylesheet>
<Groups>
 <Group>
  <GroupSelector>52</GroupSelector>
  <GroupDescription>Group 52</GroupDescription>
    <GroupValue>ABCD</GroupValue>
 </Group>
 <Group>
  <GroupSelector>27</GroupSelector>
  <GroupDescription>Group 27</GroupDescription>
  <GroupValue>PQRS</GroupValue>
 </Group>
 <Group>
  <GroupSelector>20</GroupSelector>
  <GroupDescription>Group 20</GroupDescription>
  <GroupValue>XYZA</GroupValue>
 </Group>
 <Group>
  <GroupSelector>15</GroupSelector>
  <GroupDescription>Group 15</GroupDescription>
  <GroupValue>MNOP</GroupValue>
 </Group>
</Groups>
<GroupSelection ElementName="FoundGroup" Missing="false">20</GroupSelection>
<GroupSelection ElementName="GroupDes" Missing="false">Group 20</GroupSelection>
<GroupSelection ElementName="GroupVal" Missing="false">XYZA</GroupSelection>
  <GroupSelector>20</GroupSelector>
  <GroupSelector>21</GroupSelector>
<GroupSelection ElementName="FoundGroup" Missing="true"/>
<GroupSelection ElementName="GroupDes" Missing="true"/>
<GroupSelection ElementName="GroupVal" Missing="true"/>
20
第20组
XYZA
如果在上述文件中我们更改了

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:param name="pGroupId" select="'20'"/>

 <xsl:variable name="vGroup" select=
     "/*/Group[GroupSelector=$pGroupId]"/>

 <xsl:template match="/">
     <GroupSelection ElementName="FoundGroup"
                     Missing="{not($vGroup)}">
        <xsl:apply-templates select="$vGroup/GroupSelector"/>
     </GroupSelection>
     <GroupSelection ElementName="GroupDes"
                Missing="{not($vGroup)}">
        <xsl:apply-templates select="$vGroup/GroupDescription"/>
     </GroupSelection>
     <GroupSelection ElementName="GroupVal"
                     Missing="{not($vGroup)}">
        <xsl:apply-templates select="$vGroup/GroupValue"/>
     </GroupSelection>
 </xsl:template>
</xsl:stylesheet>
<Groups>
 <Group>
  <GroupSelector>52</GroupSelector>
  <GroupDescription>Group 52</GroupDescription>
    <GroupValue>ABCD</GroupValue>
 </Group>
 <Group>
  <GroupSelector>27</GroupSelector>
  <GroupDescription>Group 27</GroupDescription>
  <GroupValue>PQRS</GroupValue>
 </Group>
 <Group>
  <GroupSelector>20</GroupSelector>
  <GroupDescription>Group 20</GroupDescription>
  <GroupValue>XYZA</GroupValue>
 </Group>
 <Group>
  <GroupSelector>15</GroupSelector>
  <GroupDescription>Group 15</GroupDescription>
  <GroupValue>MNOP</GroupValue>
 </Group>
</Groups>
<GroupSelection ElementName="FoundGroup" Missing="false">20</GroupSelection>
<GroupSelection ElementName="GroupDes" Missing="false">Group 20</GroupSelection>
<GroupSelection ElementName="GroupVal" Missing="false">XYZA</GroupSelection>
  <GroupSelector>20</GroupSelector>
  <GroupSelector>21</GroupSelector>
<GroupSelection ElementName="FoundGroup" Missing="true"/>
<GroupSelection ElementName="GroupDes" Missing="true"/>
<GroupSelection ElementName="GroupVal" Missing="true"/>
20

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:param name="pGroupId" select="'20'"/>

 <xsl:variable name="vGroup" select=
     "/*/Group[GroupSelector=$pGroupId]"/>

 <xsl:template match="/">
     <GroupSelection ElementName="FoundGroup"
                     Missing="{not($vGroup)}">
        <xsl:apply-templates select="$vGroup/GroupSelector"/>
     </GroupSelection>
     <GroupSelection ElementName="GroupDes"
                Missing="{not($vGroup)}">
        <xsl:apply-templates select="$vGroup/GroupDescription"/>
     </GroupSelection>
     <GroupSelection ElementName="GroupVal"
                     Missing="{not($vGroup)}">
        <xsl:apply-templates select="$vGroup/GroupValue"/>
     </GroupSelection>
 </xsl:template>
</xsl:stylesheet>
<Groups>
 <Group>
  <GroupSelector>52</GroupSelector>
  <GroupDescription>Group 52</GroupDescription>
    <GroupValue>ABCD</GroupValue>
 </Group>
 <Group>
  <GroupSelector>27</GroupSelector>
  <GroupDescription>Group 27</GroupDescription>
  <GroupValue>PQRS</GroupValue>
 </Group>
 <Group>
  <GroupSelector>20</GroupSelector>
  <GroupDescription>Group 20</GroupDescription>
  <GroupValue>XYZA</GroupValue>
 </Group>
 <Group>
  <GroupSelector>15</GroupSelector>
  <GroupDescription>Group 15</GroupDescription>
  <GroupValue>MNOP</GroupValue>
 </Group>
</Groups>
<GroupSelection ElementName="FoundGroup" Missing="false">20</GroupSelection>
<GroupSelection ElementName="GroupDes" Missing="false">Group 20</GroupSelection>
<GroupSelection ElementName="GroupVal" Missing="false">XYZA</GroupSelection>
  <GroupSelector>20</GroupSelector>
  <GroupSelector>21</GroupSelector>
<GroupSelection ElementName="FoundGroup" Missing="true"/>
<GroupSelection ElementName="GroupDes" Missing="true"/>
<GroupSelection ElementName="GroupVal" Missing="true"/>
21
并对修改后的XML文档应用相同的转换,再次生成所需的正确结果

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:param name="pGroupId" select="'20'"/>

 <xsl:variable name="vGroup" select=
     "/*/Group[GroupSelector=$pGroupId]"/>

 <xsl:template match="/">
     <GroupSelection ElementName="FoundGroup"
                     Missing="{not($vGroup)}">
        <xsl:apply-templates select="$vGroup/GroupSelector"/>
     </GroupSelection>
     <GroupSelection ElementName="GroupDes"
                Missing="{not($vGroup)}">
        <xsl:apply-templates select="$vGroup/GroupDescription"/>
     </GroupSelection>
     <GroupSelection ElementName="GroupVal"
                     Missing="{not($vGroup)}">
        <xsl:apply-templates select="$vGroup/GroupValue"/>
     </GroupSelection>
 </xsl:template>
</xsl:stylesheet>
<Groups>
 <Group>
  <GroupSelector>52</GroupSelector>
  <GroupDescription>Group 52</GroupDescription>
    <GroupValue>ABCD</GroupValue>
 </Group>
 <Group>
  <GroupSelector>27</GroupSelector>
  <GroupDescription>Group 27</GroupDescription>
  <GroupValue>PQRS</GroupValue>
 </Group>
 <Group>
  <GroupSelector>20</GroupSelector>
  <GroupDescription>Group 20</GroupDescription>
  <GroupValue>XYZA</GroupValue>
 </Group>
 <Group>
  <GroupSelector>15</GroupSelector>
  <GroupDescription>Group 15</GroupDescription>
  <GroupValue>MNOP</GroupValue>
 </Group>
</Groups>
<GroupSelection ElementName="FoundGroup" Missing="false">20</GroupSelection>
<GroupSelection ElementName="GroupDes" Missing="false">Group 20</GroupSelection>
<GroupSelection ElementName="GroupVal" Missing="false">XYZA</GroupSelection>
  <GroupSelector>20</GroupSelector>
  <GroupSelector>21</GroupSelector>
<GroupSelection ElementName="FoundGroup" Missing="true"/>
<GroupSelection ElementName="GroupDes" Missing="true"/>
<GroupSelection ElementName="GroupVal" Missing="true"/>

说明:使用:

  • AVT(属性值模板)

  • 文本节点的XSLT处理模型和内置模板


  • 如果不需要参数化转换,两个带文字结果元素的模板(不带AVT)就足够了:

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
        <xsl:output indent="yes"/>
        <xsl:strip-space elements="*"/>
        <xsl:template match="text()"/>
    
        <xsl:template match="/*/Group[GroupSelector=20]">
            <GroupSelection ElementName="FoundGroup" Missing="false">
                <xsl:value-of select="GroupSelector"/>
            </GroupSelection>
            <GroupSelection ElementName="GroupDes" Missing="false">
                <xsl:value-of select="GroupDescription"/>
            </GroupSelection>
            <GroupSelection ElementName="GroupVal" Missing="false">
                <xsl:value-of select="GroupValue"/>
            </GroupSelection>
        </xsl:template>
    
        <xsl:template match="/*/Group[
            not(following::Group)
            and not(preceding::Group[GroupSelector=20])
            and not(GroupSelector=20)]">
            <GroupSelection ElementName="FoundGroup" Missing="true"/>
            <GroupSelection ElementName="GroupDes" Missing="true"/>
            <GroupSelection ElementName="GroupVal" Missing="true"/>
        </xsl:template>
    
    </xsl:stylesheet>
    
    
    
    否则,如果组选择是可变的(您需要参数化变换),则可以使用有用的模板模式模式来适应上述解决方案:

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
        <xsl:output indent="yes"/>
        <xsl:strip-space elements="*"/>
        <xsl:param name="selector" select="20"/>
    
        <xsl:template match="/*/Group">
            <xsl:apply-templates select="self::*[GroupSelector=$selector]" 
                mode="selection"/>
            <xsl:apply-templates select="self::*[
                not(following::Group)
                and not(preceding::Group[GroupSelector=$selector])
                and not(GroupSelector=$selector)]" 
                mode="noselection"/>
        </xsl:template>
    
        <xsl:template match="Group" mode="selection">
            <GroupSelection ElementName="FoundGroup" Missing="false">
                <xsl:value-of select="GroupSelector"/>
            </GroupSelection>
            <GroupSelection ElementName="GroupDes" Missing="false">
                <xsl:value-of select="GroupDescription"/>
            </GroupSelection>
            <GroupSelection ElementName="GroupVal" Missing="false">
                <xsl:value-of select="GroupValue"/>
            </GroupSelection>
        </xsl:template>
    
        <xsl:template match="Group" mode="noselection">
            <GroupSelection ElementName="FoundGroup" Missing="true"/>
            <GroupSelection ElementName="GroupDes" Missing="true"/>
            <GroupSelection ElementName="GroupVal" Missing="true"/>
        </xsl:template>
    
    </xsl:stylesheet>
    
    
    
    显然,在XSLT 2.0中,您可以直接使用变量,并编写如下内容:

    <xsl:template match="/*/Group[GroupSelector=$selector]">
    
    
    

    这样事情就简单了。

    好问题,+1。请参阅我的答案,以获得简短、简单的解决方案。:)为什么有人要使用这样的冗余代码?不仅浪费空间,而且维护性也有问题。@Dimitre我在这里不关心可重用性。关于空间,它使用的空间并不比模板中的空间多。我增加了可读性。你一定很困惑,@empo,说你“增加了可读性”,有一个复杂的表达式,有不同的轴,3个模板和两个不同的模式,…,还有很多重复/冗余的代码…@Dimitre不知道复杂的表达式在哪里:PIt很明显,你没有看到这个,@empoIn我的拙见,不值得将答案本身复杂化,只是为了使重用几个文字元素成为可能。只需注意,这里的错误缩进使您的答案很难理解。@empo:为什么您认为比您的答案短两倍的解决方案是“复杂的”?:)对不起,我不懂强音的用法。还有点令人不安:)