这是我的第一个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);
}
}
我很高兴有任何帮助和建议。
答案 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元素,并且他们每个人......“。