Xslt XSl——需要转换方面的帮助吗
我是XSLT新手,正在尝试解决以下转换 我有一个XML,看起来像这样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
<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)就足够了:
<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:为什么您认为比您的答案短两倍的解决方案是“复杂的”?:)对不起,我不懂强音的用法。还有点令人不安:)