XML不能用XSLT转换?

时间:2012-07-18 19:21:22

标签: xml xslt

我正在尝试从下面的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这样的工具会有用吗?

1 个答案:

答案 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来使用常量名称,只需使用文字。