我正在尝试从下面的xml获取ageCode
属性并使用xslt,如果<Adults>3</Adults>
= 10,则放置ageCode
;如果`ageCode =,则放置<Children>0</Children>
8.这是我的示例xml:
<Root>
<Reservations>
<Reservation>
<Rooms>
<Room>
<Guests>
<Guest ageCode="10" count="3" />
<Guest ageCode="8" count="0" />
</Guests>
</Room>
</Rooms>
</Reservation>
</Reservations>
</Root>
我正在尝试将其转换为:
<Reservation>
<Rooms>
<Room>
<Adults>3</Adults>
<Children>0</Children>
</Room>
</Rooms>
</Reservation>
使用以下XSLT,但我无法使其工作(我对XSLT来说是全新的):
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<xsl:element name="Reservation">
<xsl:apply-templates />
</xsl:element>
</xsl:template>
<xsl:template match="Root/Reservations/Reservation/Rooms/Room/Guests">
<xsl:for-each select="Guest">
<xsl:if test="@ageCode = '10'">
<xsl:element name="Adults">
<xsl:value-of select="@count"/>
</xsl:element>
</xsl:if>
<xsl:if test="@ageCode = '8'">
<xsl:element name="Children">
<xsl:value-of select="@count"/>
</xsl:element>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
XSLT如何工作?我的意思是它应用模板从上到下?我问,因为你说我需要3个模板并且每个模板都应用了,所以我们进行了一次新的转换。
第一个和第二个模板实际上做了什么?有没有办法在第一次应用后显示XML,然后是第二种?我在这里正确理解XSLT吗?
您应用更深层次的模板是什么意思?
如果我必须创建许多XSLT,像MapForce这样的工具会有用吗?
答案 0 :(得分:2)
你需要3个模板:一个用于丢弃前2个元素,一个用于匹配所有内容,只输出自己和递归,一个用于做客人 - &gt;成年人转型。
第一个是
<xsl:template match="Root|Reservations">
<xsl:apply-templates/>
</xsl:template>
它不输出任何内容并应用更深层次的模板。
第二个是
<xsl:template match="*">
<xsl:element name="{name(.)}">
<xsl:apply-templates />
</xsl:element>
</xsl:template>
它输出自身(即具有当前名称的元素)并应用更深层次的模板。
第三个是你拥有的,但只匹配“来宾”而不是完整路径:
<xsl:template match="Guests">
<xsl:for-each select="Guest">
<xsl:if test="@ageCode = '10'">
<Adults>
<xsl:value-of select="@count"/>
</Adults>
</xsl:if>
<xsl:if test="@ageCode = '8'">
<Children>
<xsl:value-of select="@count"/>
</Children>
</xsl:if>
</xsl:for-each>
</xsl:template>
顺便说一句,您不需要使用xsl:element
来使用常量名称,只需使用文字。