-1

我正在尝试ageCode从下面的 xml 和 xslt 中获取属性,<Adults>3</Adults>如果ageCode= 10 或<Children>0</Children>`ageCode = 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 这样的工具会有用吗?

4

1 回答 1

2

您需要 3 个模板:一个用于丢弃前 2 个元素,一个用于匹配所有内容并仅输出自身并递归,一个用于执行您的客人 -> 成人转换。

第一个是

<xsl:template match="Root|Reservations">
    <xsl:apply-templates/>
</xsl:template>

它不输出任何内容并应用更深层次的模板。

第二个是

<xsl:template match="*">
  <xsl:element name="{name(.)}">
  <xsl:apply-templates />
  </xsl:element>
</xsl:template>

它输出自己(即具有当前名称的元素)并应用更深的模板。

第三个是您所拥有的,但只需匹配“Guests”而不是完整路径:

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

于 2012-07-18T19:37:01.027 回答