XSLT条件应用模板

时间:2015-07-07 07:41:45

标签: xml xslt

设置: Apache Xalan 2.7.1

输入:

Fragment

XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<root>
        <p>
            <code>111</code>
            <attr>good</attr>
        </p>
        <p>
            <code>222</code>
            <attr>bad</attr>
        </p>

        <s>
            <ps>
                <p>
                    <code>111</code>
                </p>
            <ps>
        </s>
        <s>
            <ps>
                <p>
                    <code>222</code>
                </p>
                <p>
                    <code>333</code>
                </p>
            <ps>
        </s>
</root>

所需选择:

我只想选择那些<?xml version="1.0" encoding="UTF-8"?> <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="/"> <xsl:apply-templates select=" root[./p/code = ./s/ps[1]/p/code and ./p/attr= 'bad']/s" /> </xsl:template> <xsl:template match="s"> <xsl:copy-of select="."/> </xsl:template> </xsl:stylesheet> s p s/ps code p bad attr <form action="index.php" method="GET" name="myform"> <table id="matrix" cellpadding="0" cellspacing="0"> <thead> <tr> <th width="5%"></th> <th width="5%">ID</th> <th width="25%">Name</th> <th width="15%">price</th> <th width="15%">count</th> <th width="5%">Link</th> </tr> </thead> <tbody> <tr id="noresults"> <td align="center" colspan="6"><h3>No results</h3></td> </tr> <? $query = "SELECT * FROM products"; $result = mysql_query($query) or die(mysql_error()); while ($row = mysql_fetch_array($result)) { $html = "<tr>"; $html .= "<th><input class='ads_Checkbox' type='checkbox' name='products[]' value='".$row['pro_name']."' onclick='myFunction()'> </th>"; $html .= "<th>".$row['pro_id']."</th>"; $html .= "<td>".$row['pro_name']."</td>"; $html .= "<td><input type='number' name='prices[]' id='price' value='".$row['pro_price']."' disabled></td>"; $html .= "<td>".$row['pro_category']."</td>"; $html .= "<td>".$row['pro_link']."</td>"; $html .= "</tr>"; echo $html; }?> <input type="submit" name="submit" value="Submit"> <textarea rows="5" cols="30" id="order"></textarea> </form> 元素<script> function myFunction() { var products = document.forms[1]; var txt = ""; var i; for (i = 0; i < products.length; i++) { if (products[i].checked) { txt = txt + products[i].value + ", "; } } document.getElementById("order").value = "" + txt; document.getElementById("price").disabled=this.checked; } </script> } {{1}}

  

注意:仅赞赏xslt 1.0解决方案

1 个答案:

答案 0 :(得分:2)

考虑使用密钥查找p元素

<xsl:key name="attr" match="root/p" use="code" />

然后您的xsl:apply-templates简化为此

<xsl:apply-templates select="root/s[key('attr', ps/p[1]/code)/attr = 'bad']" />

试试这个XSLT

<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:key name="attr" match="root/p" use="code" />

    <xsl:template match="/">  
        <xsl:apply-templates select="root/s[key('attr', ps/p[1]/code)/attr = 'bad']" />
    </xsl:template>

    <xsl:template match="s">
        <xsl:copy-of select="."/>
     </xsl:template>
</xsl:stylesheet>