Xml 带修改的XSLT复制
我一直试图在这些约束条件下工作,我使用的是XSLT1.0{under.net}。 我希望能够做到以下几点: 我是xsl:for-each,通过一组类型为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
<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>
谢谢,我真希望我不久前就考虑过这样做。仅供参考:如果节点元素有许多未知的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>