使用xsl显示xml元素的属性

时间:2013-12-06 16:35:02

标签: xml xslt if-statement xpath

这是我的第一个xsl程序,因此它必须是一个虚拟问题。但是我尝试了在“if”条件下我能看到的所有组合。但它不起作用,我无法弄清楚。我的XPath表达式必定存在synthax错误。我想只显示“n = 1”元素。我的代码就像:

my.xml

<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet type="text/xsl" href="my.xsl"?>
<lorem>
<ipsum n="1">
    <id>1</id>
    <type>asd</type>
    <cost>800</cost>
</ipsum>
<ipsum n="0">
    <id>2</id>
    <type>asd</type>
    <cost>1000</cost>
</ipsum>
</lorem>

my.xsl

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

<!--some code-->

<xsl:for-each select="ipsum">

 <xsl:if test="@n=1"><!--wrong part-->
  <xsl:sort select="cost" order="ascending" data-type="number"/>
  <tr>
   <td><xsl:value-of select="id"/></td>
   <td><xsl:value-of select="type"/></td>
   <td><xsl:value-of select="cost"/></td>
  </tr>
 </xsl:if>

</xsl:for-each>

我的显示脚本

function loadXMLDoc(dname)
{
if (window.ActiveXObject)
{
    xhttp=new ActiveXObject("Msxml2.XMLHTTP.3.0");
}
else 
{
    xhttp=new XMLHttpRequest();
}
    xhttp.open("GET",dname,false);
    xhttp.send("");
    return xhttp.responseXML;
}

function displayResult(){
xml=loadXMLDoc("my.xml");
xsl=loadXMLDoc("my.xsl");
// code for IE
if (window.ActiveXObject)
{
    ex=xml.transformNode(xsl);
        document.getElementById("myDiv").innerHTML=ex;
}
// code for Mozilla, Firefox, Opera, etc.
else if (document.implementation && document.implementation.createDocument)
{
    xsltProcessor=new XSLTProcessor();
    xsltProcessor.importStylesheet(xsl);
    resultDocument = xsltProcessor.transformToFragment(xml,document);
    document.getElementById("myDiv").appendChild(resultDocument);
}
}

我很高兴有任何帮助和建议。

1 个答案:

答案 0 :(得分:0)

只要xsl:sort必须是for-each内的第一个内容,XSLT就会出现语法错误:

<xsl:for-each select="ipsum">
 <xsl:sort select="cost" order="ascending" data-type="number"/>    
 <xsl:if test="@n=1"><!--wrong part-->

但正如user3016153在评论中建议的那样,您应该考虑将测试作为谓词放在select上,然后根本不需要if

<xsl:for-each select="ipsum[@n = 1]">
 <xsl:sort select="cost" order="ascending" data-type="number"/>    

你当前的方法是“处理所有的ipsum元素,如果它是n = 1则为每个元素处理...否则什么也不做”,谓词方法是“处理n = 1的ipsum元素,并且他们每个人......“。