Xml 带修改的XSLT复制

Xml 带修改的XSLT复制,xml,xslt,.net-3.5,mxml,Xml,Xslt,.net 3.5,Mxml,我一直试图在这些约束条件下工作,我使用的是XSLT1.0{under.net}。 我希望能够做到以下几点: 我是xsl:for-each,通过一组类型为 <node> <data> unknown unstructured xml </data> <owner></owner> </node> 未知的非结构化xml 我希望能够输出 <node> <dat

我一直试图在这些约束条件下工作,我使用的是XSLT1.0{under.net}。 我希望能够做到以下几点: 我是xsl:for-each,通过一组类型为

   <node>
     <data> unknown unstructured xml </data>
     <owner></owner>
   </node>

未知的非结构化xml
我希望能够输出

   <node>
     <data> unknown unstructured xml </data>
     <!--RESULT of calling an XSL template with certain parameters -->
   </node>

未知的非结构化xml
从目前为止的搜索结果来看,我认为我可以做如下事情:


但这显然是无效的。有没有什么建议可以让它工作起来,或者实现类似的效果?恐怕我不能只调用apply templates,因为我想要的模板将取决于我通过节点元素列表为每个元素创建的一些数据

感谢您的任何建议


<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>

这是一个典型的问题示例,最好使用并覆盖

<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文档):


未知的非结构化xml
约翰·史密斯
XSLT程序员
产生所需结果

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

未知的非结构化xml
JohnSmith XSLT程序员
注意事项

<node attr1="x" attr2="y">
   <data> unknown unstructured xml </data>
   <owner-details>John Smith XSLT programmer</owner-details>
</node>
  • 标识模板以递归方式“原样”复制文档中的每个节点

  • 我们只覆盖要以另一种方式处理的元素的标识模板。任何模板(其匹配模式比标识模板的匹配模式更具体)都会覆盖它——XSLT处理器总是为节点选择最具体的匹配模板

  • 使用和覆盖标识规则是最基本的、最强大的、最通用的和最优雅的XSLT设计模式。它仅用于几乎所有XSLT转换:用于删除/重命名/修改/添加特定节点,并保持所有其他节点不变

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

  • 匹配所有者的模板不需要调用另一个模板——所有特定于所有者的处理都可以在这里完成


  • 谢谢,我真希望我不久前就考虑过这样做。仅供参考:如果节点元素有许多未知的attirbutes需要复制,会发生什么?也可以做一个你能做的回答你两个问题的测试。对于更复杂的情况,或者来自不同名称空间的“owner”元素的可能性,则使用override标识(如Dimitre的回答)会变得更加优雅(我们可以通过Dimitre和我的答案来扩展,以处理更复杂的情况;我的答案在某种复杂程度下更简洁,而Dimitre的答案在某种复杂程度上更简洁,这也使得Dimitre的答案更一般,每个XSLT编码人员都应该知道这个答案)。(注:如果上面的答案有帮助,接受答案会更好).谢谢你提供的额外信息Jon,看来这会起作用的。既然Dimitre的答案不处理传递参数,而你的答案处理传递参数,我将接受你的答案-谢谢:)@GreyCloud:你说的“Dimitre的答案不处理传递参数”不是真的——您只是没有请求它,您的问题不需要传递参数。我已经更新了我的答案,解释了这些要点。这对你来说是一个学习一些基本的、非常有用的东西的好时机。@Jon Hanna:你的答案是错误的。
    应用模板
    说明中没有
    @name
    。这是
    调用模板
    指令,其中包含
    @name
    。问得好(+1)。请参阅我的答案,了解完全符合XSLT精神的最简单解决方案,它利用了最基本的XSLT设计模式——身份规则的使用和覆盖。嗨,Dimitre,谢谢你的解决方案,我在另一个线程中看到了类似的答案,但恐怕不行,因为我无法通过调用传递任何参数。@GreyCloud:你不明白:1。可以通过任何模板传递参数。对于您问题中的问题,不需要这样做。修改问题,使其需要传递参数,我将演示如何传递参数。2.在匹配
    owner
    的模板中,您不需要调用另一个模板并将参数传递给它——您只需处理此模板中的
    owner
    元素(及其子树)——这就是我的答案所建议的。我如何传递参数“”?@GreyCloud:
    @Dimitre:+1获取完整正确的答案。而且,当你回答这个简单的问题时,你似乎还没有被倾听过(我跟随了OP链接)
    <node attr1="x" attr2="y">
       <data> unknown unstructured xml </data>
       <owner-details>John Smith XSLT programmer</owner-details>
    </node>