带有修改的XSLT副本

时间:2010-08-08 21:51:15

标签: xml xslt .net-3.5 mxml

我试图在这些约束下工作,我正在使用XSLT 1.0 {在.net}。 我希望能够做到以下几点: 我是xsl:for-each'ing通过一组

类型的节点
   <node>
     <data> unknown unstructured xml </data>
     <owner></owner>
   </node>

我希望能够输出

   <node>
     <data> unknown unstructured xml </data>
     <!--RESULT of calling an XSL template with certain parameters -->
   </node>
到目前为止,从我的搜索

我认为我可以在here中做一些事情:

    <xsl:copy> 
        <xsl:apply-template name="findownerdetails">
           <xsl:with-param name="data" select="something" />
        </xsl:apply-template> 
    </xsl:copy> 

但这显然无效。任何建议如何使这个工作或实现类似的东西?我担心我不能只调用apply-templates作为我想要的模板将取决于我通过节点元素列表构建的每个数据。

任何建议表示赞赏

2 个答案:

答案 0 :(得分:5)

这是使用和覆盖identity rule 最佳解决问题的典型示例:

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="owner">
    <owner-details>
      <xsl:value-of select="."/>
    </owner-details>
 </xsl:template>
</xsl:stylesheet>

对此XML文档应用此转换时(基于提供的XML文档以及添加的属性和所有者详细信息):

<node attr1="x" attr2="y">
    <data> unknown unstructured xml </data>
    <owner>
        <details>
            <name>John Smith </name>
            <profession>XSLT programmer</profession>
        </details>
    </owner>
</node>

生成了想要的结果

<node attr1="x" attr2="y">
   <data> unknown unstructured xml </data>
   <owner-details>John Smith XSLT programmer</owner-details>
</node>

请注意

  1. 身份模板以递归方式“按原样”复制文档中的每个节点

  2. 我们只覆盖我们希望以其他方式处理的元素的标识模板。任何匹配模式比标识模板更具体的模板都会覆盖它 - XSLT处理器总是为节点选择最具体的匹配模板。

  3. 使用和覆盖标识规则是最基本的,最强大,最通用的和最优雅的XSLT设计模式。它几乎专门用于所有XSLT转换:用于删除/重命名/修改/添加特定节点以及保持所有其他节点完好无损。

  4. OP在评论中建议此解决方案不允许传递参数。这不是真的。可以编写任何模板(包括标识规则)以具有参数 - 当需要时。在这种特殊情况下,通过模板传递参数是

  5. 匹配owner 的模板不需要来调用另一个模板 - 所有特定于所有者的处理都可以在这里完成。< / p>

答案 1 :(得分:1)

<xsl:template match="node">
  <node>
    <xsl:copy-of select="data"/>
    <!-- assuming this next bit in your question example
    is something you are happy with -->
    <xsl:call-template name="findownerdetails">
      <xsl:with-param name="data" select="something" />
    </xsl:call-template> 
  </node>
</xsl:template>