XSL问题创建树

时间:2013-02-13 09:43:20

标签: java xml xslt

我有XML文件

<?xml version="1.0" encoding="ISO-8859-1"?>
<childrens>
  <child entity_id="1" value="Root Catalog" parent_id="0">
    <child entity_id="2" value="Apparel" parent_id="1">
      <child entity_id="4" value="Shirts" parent_id="2"/>
      <child entity_id="5" value="Pants" parent_id="2"/>
    </child>
    <child entity_id="3" value="Accessories" parent_id="1">
      <child entity_id="6" value="Handbags" parent_id="3"/>
      <child entity_id="7" value="Jewelry" parent_id="3"/>
    </child>
     .
     .
     .
    <child entity_id='1110' value="test" parent_is="1109">
       <child entity_id='1111' value="test0" parent_is="1110">
           <child entity_id="1005" value="test1" parent_is="1111"/>
           <child entity_id="1006" value="test12" parent_is="1111"/>
           <child entity_id="1007" value="test123" parent_is="1111"/>
        <child>
    </child>
  <child >
</childrens>

现在我写了这个XSL代码

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html" indent="yes" omit-xml-declaration="yes"/>
  <xsl:param name="selected" />

  <xsl:template match="/*">
    <xsl:apply-templates select="*[not($selected)] | //*[@entity_id = $selected]/*" />
  </xsl:template>

  <xsl:template match="*">
    <span onclick="displayResult('{@entity_id}');">
      <xsl:value-of select="concat(@value, '&#xA0;')"/><br/>
    </span>
  </xsl:template>
</xsl:stylesheet>

,HTML是

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
                      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Region</title>
    <link href='style.css' rel='stylesheet' type='text/css'/>
    <script>
        var xml = loadXMLDoc("tree.xml");
        var xsl = loadXMLDoc("try.xsl");

        function loadXMLDocActiveX(location) {
            var doc = new ActiveXObject("MSXML2.FreeThreadedDOMDocument");
            doc.async = false;
            doc.load(location);
            return doc;
        }

        function loadXMLDocOther(location) {
            xhttp = new XMLHttpRequest();
            xhttp.open("GET", location, false);
            xhttp.send("");
            return xhttp.responseXML;
        }

        function loadXMLDoc(dname) {
            if (window.ActiveXObject) {
                return loadXMLDocActiveX(dname);
            }
            else if (window.XMLHttpRequest) {
                return loadXMLDocOther(dname);
            }
        }

        function transformActiveX(xml, xsl, target, selected) {
            var transform = new ActiveXObject("MSXML2.XSLTemplate");
            transform.stylesheet = xsl;
            var processor = transform.createProcessor();
            processor.input = xml;

            if (selected) {
                processor.addParameter("selected", selected);
            }

            processor.transform();
            target.innerHTML = processor.output;
        }

        function transformOther(xml, xsl, target, selected) {
            var xsltProcessor = new XSLTProcessor();
            xsltProcessor.importStylesheet(xsl);

            if (selected) {
                xsltProcessor.setParameter(null, "selected", selected);
            }

            var resultDocument = xsltProcessor.transformToFragment(xml, document);
            target.innerHTML = "";
            target.appendChild(resultDocument);
        }

        function displayResult(selected) {
            var targetElement = document.getElementById("load");

            // code for IE
            if (window.ActiveXObject) {
                transformActiveX(xml, xsl, targetElement, selected);
            }
            // code for Mozilla, Firefox, Opera, etc.
            else if (document.implementation && 
                     document.implementation.createDocument) {
                transformOther(xml, xsl, targetElement, selected);
            }
        }
    </script>
</head>
<body onload="displayResult()">
    <div id="load">
    </div>
</body>
</html>

我正在使用此代码制作树,现在我想要那个

中的xsl

1)我想从特定节点开始,例如test entity_id=1110

2)leaf元素有一个类child,例如,在元素的情况下,叶元素是test1, test12, test123,其中value = test,而value = test0

1 个答案:

答案 0 :(得分:1)

这个怎么样:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html" indent="yes" omit-xml-declaration="yes"/>
  <xsl:param name="defaultValue" select="'test'" />
  <xsl:param name="selected" select="//*[@value = $defaultValue]/@entity_id" />

  <xsl:template match="/*">
    <xsl:apply-templates select="*[not($selected)] | //*[@entity_id = $selected]/*" />
  </xsl:template>

  <xsl:template match="*">
    <span onclick="displayResult('{@entity_id}');">
      <xsl:if test="not(*)">
         <xsl:attribute name="class">leaf</xsl:attribute>
      </xsl:if>
      <xsl:value-of select="concat(@value, '&#xA0;')"/><br/>
    </span>
  </xsl:template>
</xsl:stylesheet>

如果您向select添加xsl:param属性,则可以指明要用作默认起始项的项目的entity_id

第二个模板中的xsl:if会将class="leaf"属性添加到叶节点。

相关问题