Gre*_*oud 2 xml xslt mxml .net-3.5
我试图在这些约束下工作,我正在使用XSLT 1.0 {在.net}.我希望能够做到以下几点:我是xsl:for-each'ing通过一组类型的节点
<node>
<data> unknown unstructured xml </data>
<owner></owner>
</node>
Run Code Online (Sandbox Code Playgroud)
我希望能够输出
<node>
<data> unknown unstructured xml </data>
<!--RESULT of calling an XSL template with certain parameters -->
</node>
Run Code Online (Sandbox Code Playgroud)
从我的搜索到目前为止,我想我可以做这样的事情在这里:
<xsl:copy>
<xsl:apply-template name="findownerdetails">
<xsl:with-param name="data" select="something" />
</xsl:apply-template>
</xsl:copy>
Run Code Online (Sandbox Code Playgroud)
但这显然无效.任何建议如何使这个工作或实现类似的东西?我担心我不能只调用apply-templates作为我想要的模板将取决于我通过节点元素列表构建的每个数据.
任何建议表示赞赏
这是使用和覆盖标识规则最好解决的问题的典型示例:
<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>
Run Code Online (Sandbox Code Playgroud)
在此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>
Run Code Online (Sandbox Code Playgroud)
产生了想要的结果:
<node attr1="x" attr2="y">
<data> unknown unstructured xml </data>
<owner-details>John Smith XSLT programmer</owner-details>
</node>
Run Code Online (Sandbox Code Playgroud)
请注意:
身份模板以递归方式"按原样" 复制文档中的每个节点.
我们只覆盖要以其他方式处理的元素的标识模板.任何模板的匹配模式都比标识模板更具体,它会覆盖它 - XSLT处理器总是为节点选择最具体的匹配模板.
使用和覆盖标识规则是最基本,最强大,最通用和最优雅的XSLT设计模式.它几乎专门用于所有XSLT转换:用于删除/重命名/修改/添加特定节点并保持所有其他节点完好无损.
OP在评论中建议该解决方案不允许传递参数.事实并非如此.可以编写任何模板(包括标识规则)以具有参数 - 当需要时.在这种特殊情况下,没有必要通过模板传递参数.
模板匹配owner 不需要调用另一个模板 - 所有特定于所有者的处理都可以在此处完成.