我试图在这些约束下工作,我正在使用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作为我想要的模板将取决于我通过节点元素列表构建的每个数据。
任何建议表示赞赏
答案 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>
请注意:
身份模板以递归方式“按原样”复制文档中的每个节点。
我们只覆盖我们希望以其他方式处理的元素的标识模板。任何匹配模式比标识模板更具体的模板都会覆盖它 - XSLT处理器总是为节点选择最具体的匹配模板。
使用和覆盖标识规则是最基本的,最强大,最通用的和最优雅的XSLT设计模式。它几乎专门用于所有XSLT转换:用于删除/重命名/修改/添加特定节点以及保持所有其他节点完好无损。
OP在评论中建议此解决方案不允许传递参数。这不是真的。可以编写任何模板(包括标识规则)以具有参数 - 当需要时。在这种特殊情况下,通过模板传递参数是不。
匹配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>