【问题标题】:Applying appendTo for adding a sort node to apply-template应用 appendTo 将排序节点添加到应用模板
【发布时间】:2017-08-09 10:29:06
【问题描述】:

我正在尝试使用 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>

谢谢!

【问题讨论】:

    标签: javascript jquery xml xslt append


    【解决方案1】:

    您可以简单地在 XSLT 中定义一个全局参数&lt;xsl:param name="sort-key"/&gt; 然后拥有

            <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 样式表。

    【讨论】:

    • 感谢您的回复,这将工作。不幸的是,由于我的要求,我不得不通过动态更改 XSLT 来获得我的结果。
    【解决方案2】:

    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

    【讨论】:

    • 不幸的是,它没有这样做。我认为问题可能出在 $("div#append_here" ) 上。在您的版本和我的版本中,jquery 都没有成功定位外部 xsl 文档。
    • 我确实发现了一个 hack。不幸的是,它不涉及任何append 方法。在原始的 xsl 表中,我有这个:&lt;xsl:apply-templates select="/guitars/guitar"&gt; &lt;xsl:sort select="nothing" data-type="text"/&gt; &lt;/xsl:apply-templates&gt;,然后我只是在我的 html 页面中使用它:$(stylesheet).find("xsl\\:sort, sort").first().attr("select", sortByElement); where sortByElement = 型号、年份、价格等。
    猜你喜欢
    • 2015-03-27
    • 1970-01-01
    • 2017-11-19
    • 1970-01-01
    • 1970-01-01
    • 2016-09-04
    • 2019-02-21
    • 2018-06-22
    • 2011-11-11
    相关资源
    最近更新 更多