我还在学习XSL,我正在尝试将我从XSL获得的值更改为另一个值。 (我正在使用在线网站将我的XML转换为使用XSL的另一种XML)
XML
<?xml version="1.0" encoding="UTF-8"?>
<Person>
<Student>
<Info Name="Jen" Age="20" Class="C" />
</Student>
<Student>
<Info Name="Sam" Age="21" Class="B" />
</Student>
</Person>
假设有许多students
(甚至同名)
XSLT
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:template match="Person">
<Person>
<lookuptable>
<name first="Jen" ori="Jenny" />
<name first="Sam" ori="Sammy" />
</lookuptable>
<xsl:for-each select="Student">
<Info Name="{Info/@Name}" Age="{Info/@Age}" Class="{Info/@Class}" />
</xsl:for-each>
</Person>
</xsl:template>
</xsl:stylesheet>
我创建了一个查找表
输出是
<?xml version="1.0" encoding="UTF-8"?>
<Person>
<lookuptable>
<name ori="Jenny" first="Jen" />
<name ori="Sammy" first="Sam" />
</lookuptable>
<Info Class="C" Age="20" Name="Jen" />
<Info Class="B" Age="21" Name="Sam" />
</Person>
我想改变我的输出,这意味着每次“Jen”出现我希望它是“Jenny”等使用我的查找表。我怎么能实现这个目标?或者更容易创建另一个XSL来将输出(最后的XML)转换为我需要的要求?提前谢谢..
答案 0 :(得分:1)
您可以将查找表放在变量中,并通过节点集扩展使用它。我在http://www.xsltcake.com/
上试了一下<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
xmlns:exsl="http://exslt.org/common">
<xsl:variable name="lookuptable">
<lookuptable>
<name first="Jen" ori="Jenny" />
<name first="Sam" ori="Sammy" />
</lookuptable>
</xsl:variable>
<xsl:template match="Person">
<Person>
<xsl:copy-of select="$lookuptable"/>
<xsl:for-each select="Student">
<xsl:variable name="key" select="Info/@Name"/>
<Info Age="{Info/@Age}" Class="{Info/@Class}">
<xsl:attribute name="Name">
<xsl:value-of select="exsl:node-set($lookuptable)/lookuptable/name[@first=$key]/@ori"/>
</xsl:attribute>
</Info>
</xsl:for-each>
</Person>
</xsl:template>
</xsl:stylesheet>
有关详细信息,请参阅Pavel Minaev对XSL: How best to store a node in a variable and then us it in future xpath expressions?的回答 它还解释了在使用XSLT 2时不需要exsl扩展。因此,您可能希望改进我的XSLT 2方法。
答案 1 :(得分:1)
这是@ halfbit答案的XSLT 2.0版本(我没有将查找表复制到输出中,我认为不是真的需要):
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:variable name="lookuptable" as="element(name)*">
<name first="Jen" ori="Jenny" />
<name first="Sam" ori="Sammy" />
</xsl:variable>
<xsl:template match="Person">
<Person>
<xsl:for-each select="Student">
<xsl:variable name="key" select="Info/@Name"/>
<Info Age="{Info/@Age}" Class="{Info/@Class}">
<xsl:attribute name="Name" select="$lookuptable[@first=$key]/@ori"/>
</Info>
</xsl:for-each>
</Person>
</xsl:template>
</xsl:stylesheet>