应用appendTo将排序节点添加到apply-template

时间:2017-03-17 18:27:03

标签: javascript jquery xml xslt append

我正在尝试使用jquery以编程方式插入appendTo()方法。我有一个格式化样式表,格式化xml表,但我使用jquery和javascript在第三个HTML文档中。我的原始xml采用以下格式:

<guitars>
    <guitar>
        <model>AStrat</model>
        <year>1978</year>
        <name>Strat</name>
        <price>2500</price>
    </guitar>
</guitars>

我的样式表是这样的:

<?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>Name</th>
                <th>Price</th>
            </tr>
            <xsl:apply-templates select="/guitars/guitar">
            </xsl:apply-templates>
        </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="name"/> </td>
            <td> <xsl:value-of select="price" /> </td>
        </tr>
    </xsl:template>

</xsl:stylesheet>

这是我的javascript。 stylesheet是通过ajax导入的样式表,我检查过的工作正常。

var nodeToAppend = '<xsl:sort select="model" data-type="text"/>'
$(nodeToAppend).appendTo( $(stylesheet)
                              .find("xsl\\:apply-templates, apply-templates")
                              .first() );

但这似乎并不想采取。稍后,我通过XSLT处理器将XSL应用于XML。我有什么想法,我做错了什么? 基本上我想要这一行:

<xsl:apply-templates select="/guitars/guitar">
                </xsl:apply-templates>

成为:

<xsl:apply-templates select="/guitars/guitar">
          <xsl:sort select="model" data-type="text"/>
</xsl:apply-templates>

谢谢!

2 个答案:

答案 0 :(得分:1)

您可以在XSLT中定义全局参数<xsl:param name="sort-key"/>,然后使用

        <xsl:apply-templates select="/guitars/guitar">
          <xsl:sort select="*[local-name() = $sort-key]"/>
        </xsl:apply-templates>

然后,您不必每次需要更改该密钥时操纵XSLT代码,而只需设置不同的参数,例如:给定var proc = new XSLTProcessor();导入的样式表后,您可以设置例如在运行下一个转换之前proc.setParameter('', 'sort-key', 'model');。无需操作XSLT样式表。

答案 1 :(得分:0)

XSLT

      

      <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>Name</th>
                  <th>Price</th>
              </tr>
              <div id="append_here">
              <xsl:apply-templates select="/guitars/guitar">
              </xsl:apply-templates>
              </div>
          </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="name"/> </td>
              <td> <xsl:value-of select="price" /> </td>
          </tr>
      </xsl:template>

  </xsl:stylesheet>

<强> jquery的

//<xsl:apply-templates><![CDATA[
  $(function() {
    $("div#append_here" ).children().append('<xsl:sort select="model" data-type="text"/>');
  });
//]]></xsl:apply-templates>

<强> JSFIDDLE