1

我有以下 XML:

<HTML>
  <HEAD>
    <META name="GENERATOR" content="Microsoft HTML Help Workshop 4.1" />
    <!-- Sitemap 1.0 -->
  </HEAD>
  <BODY>
    <OBJECT type="text/site properties">
      <param name="FrameName" value="contents" />
    </OBJECT>
    <UL>
      <LI>
        <OBJECT type="text/sitemap">
          <param name="Name" value="Title1" />
          <param name="Local" value="Ref1" />
        </OBJECT>
        <UL>
          <LI>
            <OBJECT type="text/sitemap">
              <param name="Name" value="Title 2" />
              <param name="Local" value="Ref2" />
            </OBJECT>
            <UL>
              <LI>
                <OBJECT type="text/sitemap">
                  <param name="Name" value="Title3" />
                  <param name="Local" value="Ref3" />
                </OBJECT>
              </LI>
              <LI>
                <OBJECT type="text/sitemap">
                  <param name="Name" value="Title4" />
                  <param name="Local" value="Ref4" />
                </OBJECT>
              </LI>
            </UL>
          </LI>
          <LI>
            <OBJECT type="text/sitemap">
              <param name="Name" value="Title5" />
              <param name="Local" value="Ref5" />
            </OBJECT>
          </LI>
        </UL>
      </LI>
      <LI>
        <OBJECT type="text/sitemap">
          <param name="Name" value="Title6" />
          <param name="Local" value="Ref6" />
        </OBJECT>
      </LI>
    </UL>
  </BODY>
</HTML>

我需要将其转换为“Eclipse Help”格式toc.xml文件,如下所示:

<toc label="Sample Table of Contents">
  <topic label="Title1"  href="Ref1"> 
    <topic label="Title2" href="Ref2">
      <topic label="Title3" href="Ref3"/>
        <topic label="Title4" href="Ref4"/>
      </topic> 
      <topic label="Title5" href="Ref5">
    </topic> 
  </topic>
  <topic label="Title6" href="Ref6"/>
</toc>

我尝试创建以下 XSLT,但没有成功:

<?xml version="1.0" encoding="utf-8"?>
<?altova_samplexml D:\Documents and Settings\oshecht\Desktop\XSL\Copy of toc.xml?>
<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="/">
    <toc>
      <xsl:apply-templates select="//LI" />
    </toc>
  </xsl:template>

  <xsl:template match="//LI">
    <topic>
      <xsl:apply-templates select="OBJECT/param" mode="val" />
      <xsl:apply-templates select="OBJECT/param" mode="ref" />
      <xsl:apply-templates select="/UL/LI" />
      <!--xsl:apply-templates select="//UL//LI"  mode="subelement" /-->
    </topic>
  </xsl:template>

  <xsl:template match="OBJECT/param" mode="val">
    <xsl:if test="@name = 'Name'">
      <xsl:attribute name="label">
        <xsl:value-of select="@value" />
      </xsl:attribute>
    </xsl:if>
  </xsl:template>

  <xsl:template match="OBJECT/param" mode="ref">
    <xsl:if test="@name = 'Local'">
      <xsl:attribute name="href">
        <xsl:value-of select="@value" />
      </xsl:attribute>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>

你能给些建议么?

谢谢:)

4

2 回答 2

3

我认为以下内容可以满足您的要求:

<xsl:template match="BODY">
    <toc label="Sample Table of Contents">
        <xsl:apply-templates select="UL/LI/OBJECT"/>
  </toc>
</xsl:template>

<xsl:template match="OBJECT">
  <topic label="{param[@name='Name']/@value}" href="{param[@name='Local']/@value}">
    <xsl:apply-templates select="following-sibling::UL/LI/OBJECT"/>
  </topic>
</xsl:template>
于 2009-10-12T09:41:07.367 回答
1

您的主要问题是这一行:

<xsl:apply-templates select="//LI"  />

这会生成输入中所有<LI>元素的列表,从而创建一个平面输出列表。您可以使用内置递归和“随波逐流”,如下所示:

<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="BODY">
    <toc>
      <xsl:apply-templates select="OBJECT" />
      <xsl:apply-templates select="UL" />
    </toc>
  </xsl:template>

  <xsl:template match="UL">
    <xsl:apply-templates select="LI" />
  </xsl:template>

  <xsl:template match="LI">
    <topic>
      <xsl:apply-templates select="OBJECT" />
      <xsl:apply-templates select="UL" />
    </topic>
  </xsl:template>

  <xsl:template match="OBJECT">
    <xsl:apply-templates select="param" />
  </xsl:template>

  <xsl:template match="OBJECT/param">
    <xsl:variable name="attrName">
      <xsl:choose>
        <xsl:when test="@name = 'FrameName'">label</xsl:when>
        <xsl:when test="@name = 'Name'">label</xsl:when>
        <xsl:when test="@name = 'Local'">href</xsl:when>
      </xsl:choose>
    </xsl:variable>
    <xsl:if test="$attrName != ''">
      <xsl:attribute name="{$attrName}">
        <xsl:value-of select="@value" />
      </xsl:attribute>
    </xsl:if>
  </xsl:template>

</xsl:stylesheet>

产生的输出是:

<?xml version="1.0" encoding="utf-8"?>
<toc label="contents">
  <topic label="Title1" href="Ref1">
    <topic label="Title 2" href="Ref2">
      <topic label="Title3" href="Ref3"></topic>
      <topic label="Title4" href="Ref4"></topic>
    </topic>
    <topic label="Title5" href="Ref5"></topic>
  </topic>
  <topic label="Title6" href="Ref6"></topic>
</toc>

请注意,我将您的“模式”模板替换为<xsl:choose>. 其余的很明显,我想。

于 2009-10-12T09:50:30.883 回答