1

我知道这很容易,但我试过了,XSLT 对我来说真的无法理解……这就是为什么我想在我的代码上有一个例子,这样我就可以在真实案例中检查它并可能理解它。

所以我有一个应用程序,它有 GUI 树视图并生成我这种类型的 XML:

<TreeView>
  <Parent text="Installation">
    <child text="Startup" type="video" file="startup.wmv" icon="c://user/desktop/blahblah.jpg"/>
    <child text="Getting there" type="video" file="gettingthere.wmv" icontPath="something"/>
    <child text="Steps" type="document" file="steps.docx" icon="asd"/>
    <child text="Pictures" type="image" file="pics.jpg" icon="dasdasdas"/>
  </Parent>
  <Parent text="Usage">
    <child text="Tilbud pane" type="video" file="tilbud.mwv" icon="asdasd"/>
    <child text="Report pane" type="document" file="report.docx" icon="gfdhd"/>
  </Parent>
</TreeView>

然后我需要将此 XML 转换为 HTML,以便我可以在我的网站中更新它。

所以我不需要<html>and<body>标签。我只需要将此 XML 排序到一个列表中,而在子元素之前应该有一些空间。

用户在浏览器中查看的所需输出将如下所示:

Installation
  Startup
  Getting there
  Steps
  Pictures
Usage
  Tilbud pane
  Report pane

但是因为我在属性中不会有相同的值 - 我必须对元素进行排序。

这就是我所拥有的:

<?xml version = "1.0" encoding = "utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <ul>
      <xsl:for-each select="Parent">
        <li>
        <xsl:value-of select="@text"/>
          <ul>
            <xsl:for-each select="Parent/child"/>
            <li>
            <xsl:value-of select="@text"/>
            </li>
            </xsl:for-each>
          </ul>
        </li>
      </xsl:for-each>
    </ul>
  </xsl:template>
</xsl:stylesheet>

我必须得到的所需html是这样的:

<ul>
    <li>Parent
         <ul>
               <li>Child</li>
               <li>Child</li>
 .....
         </ul>
    </li>
   <li>Parent
         <ul>
               <li>Child</li>
               <li>Child</li>
 .....
         </ul>
   </li>
.....
</ul>

但显然它不想给我这个......它<ul/>在我运行转换后给我......

4

2 回答 2

1

您的 XSLT 不起作用,因为它Parent直接搜索/TreeView介于两者之间。

<xsl:template match="/TreeView">
   ...
于 2013-08-19T14:30:38.540 回答
0

Here is a stylesheet that does the transform:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="html" encoding="utf-8"/>

    <xsl:template match="/">
        <ul>
        <xsl:apply-templates/>
        </ul>
    </xsl:template>

    <xsl:template match="Parent">
        <li>
        <xsl:value-of select="@text"/>
        <br/>
        <ul>
            <xsl:apply-templates select="child"/>
        </ul>
        </li>
    </xsl:template>

    <xsl:template match="child">
        <li><xsl:value-of select="@text"/></li>
    </xsl:template>

</xsl:stylesheet>

If you just want text output:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="text" encoding="utf-8"/>

    <xsl:template match="Parent">
        <xsl:value-of select="@text"/>
        <xsl:text>&#xa;  </xsl:text>
        <xsl:apply-templates select="child"/>
    </xsl:template>

    <xsl:template match="child">
        <xsl:text>  </xsl:text>
        <xsl:value-of select="@text"/>
        <xsl:text>&#xa;  </xsl:text>
    </xsl:template>

</xsl:stylesheet>
于 2013-08-19T13:37:24.613 回答