我正在练习一些XSL并使用这个XML文档作为一个简单的例子:
<?xml version="1.1" encoding="UTF-8"?>
<zoo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="zoo.xsd" >
<animals>
<animal type="lion">
<name>Zeus</name>
<gender>M</gender>
<eats>antelope</eats>
<eats>monkey</eats>
</animal>
<animal type="monkey">
<name>Fredo</name>
<gender>M</gender>
<eats>banana</eats>
<iseatenby>lion</iseatenby>
</animal>
<animal type="lion">
<name>Here</name>
<gender>F</gender>
<eats>antelope</eats>
<eats>monkey</eats>
</animal>
<animal type="antelope">
<name>Annie</name>
<gender>F</gender>
<eats>grass</eats>
<iseatenby>lion</iseatenby>
</animal>
<animal type="elephant">
<name>Moses</name>
<gender>M</gender>
<eats>leaves</eats>
</animal>
</animals>
</zoo>
我已经能够通过我的XSL文档获得一些基本信息了,但我现在只停留在一件事:如果有多个所有结果?例如,在我的文档中,一些动物有多个“吃”元素。我想用逗号分隔的字符串显示它们;最终我想将每个动物的元素转换为属性,并且每个元素只有一个属性。 (使用我之前的例子,新的动物元素lion的“吃”属性看起来像这样:eats="antelope, monkey"
)
有人可以解释一下如何用XSL做这样的事情吗?任何帮助深表感谢。 :)
答案 0 :(得分:2)
虽然不尽如人意:)
尝试它现在希望它有所帮助..我将每个元素转换为属性..
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="//animal">
<xsl:copy>
<!--copies all other elements as attributes-->
<xsl:for-each select="*[name()!='eats']">
<xsl:attribute name="{name()}">
<xsl:apply-templates select = "text()"/>
</xsl:attribute>
</xsl:for-each>
<xsl:attribute name="eats">
<!-- Go to <eats/> node -->
<xsl:for-each select="eats">
<!--insearts string ", " if it has preceding values already :) -->
<xsl:if test="preceding-sibling::eats">
<xsl:text>, </xsl:text>
</xsl:if>
<!--copies all the text :) -->
<xsl:apply-templates select="text()"/>
</xsl:for-each>
</xsl:attribute>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:1)
使用此:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="zoo/animals">
<xsl:copy>
<xsl:apply-templates select="animal"/>
</xsl:copy>
</xsl:template>
<xsl:template match="animal">
<xsl:copy>
<xsl:attribute name="eats">
<xsl:for-each select="eats">
<xsl:value-of select="."/>
<xsl:if test="position() != last()">
<xsl:text>,</xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:attribute>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
参考:
位置函数返回一个等于上下文位置的数字 从表达评估上下文。 last 函数返回一个等于上下文大小的数字 表达评估背景。
xsl:if
检查当前节点是否不是上下文中的最后一个节点。如果是,请输出,
。