基于节点的部分匹配填充表

时间:2017-03-15 23:24:28

标签: xml xslt xpath html-table

我有一个XML Doc:

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="guitarsXSLStyleSheet.xsl" type="text/xsl"?>
<guitars>
    <guitar>
        <model>Strat</model>
        <year>1978</year>
        <price>2500</price>
    </guitar>
    <guitar>
        <model>Jaguar</model>
        <year>2006</year>
        <price>400</price>
    </guitar>
    <guitar>
        <model>Strat</model>
        <year>2015</year>
        <price>900</price>
    </guitar>
    <guitar>
        <model>Tele</model>
        <year>1981</year>
        <price>1200</price>
    </guitar>
</guitars>

我有一个XSL样式表,可以将这些值转换为表格,只取出模型为策略的吉他:

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

    <xsl:output method="html" version="4.0" encoding="UTF-8" indent="yes"/>

    <xsl:template match="/">
        <table id="guitarTable" border="1" width="200">
            <tr class="header">
                <th>Model</th>
                <th>Year</th>
                <th>Price</th>
            </tr>
            <xsl:apply-templates select="//guitar[model = 'Strat']"/>
        </table>
    </xsl:template>

    <xsl:template match="guitar">
        <tr>
            <td> <xsl:value-of select="model" /> </td>
            <td> <xsl:value-of select="year" />  </td>
            <td> <xsl:value-of select="price" /> </td>
        </tr>
    </xsl:template>

</xsl:stylesheet>

现在实际上对于XSL文档,我通过jquery在基于用户输入的单独HTML文档中插入[model = 'Strat'](也许用户输入“Strat”,也许他们输入“Jaguar”,结果表格基于此形成了自己,但是我在这个简化的层面上寻找基础级别的解释。

我正在考虑尝试在部分完成用户搜索时获取模型名称,并且我想使用函数contains(string, string)

我在使用

替换我的XSL中的select="//guitar[model = 'Strat']"

select="//guitar/model[contains(., 'Stra')]"

但是这会破坏结果表,只保留标题行并返回一个只显示“StratStrat”的单个“未装箱”行。

有什么想法吗?理想情况下,我会以某种方式继续使用“包含”方法,我想我搞乱了Xpath。或者它可能需要在xsl的模板匹配部分?谢谢!

1 个答案:

答案 0 :(得分:1)

  

我在我的XSL中替换了select="//guitar[model = 'Strat']"   与

select="//guitar/model[contains(., 'Stra')]"

由于您的模板与guitar匹配,因此您还需要将模板应用于guitar,而不是应用于其子model

select="//guitar[contains(model, 'Stra')]"

P.S。 //很昂贵 - 用准确的路径替换它,例如:

select="guitars/guitar[contains(model, 'Stra')]"