没有 xsl:copy-of 的 XSLT 复制
Posted
技术标签:
【中文标题】没有 xsl:copy-of 的 XSLT 复制【英文标题】:XSLT copying without xsl:copy-of 【发布时间】:2011-04-28 12:14:56 【问题描述】:我有一些 *.xml,其中包含以下元素:
<app-method name="leave-accrual-status-details" kind="enquiry">
<title>...</title>
<required-roles>
<role name="authenticated"/>
</required-roles>
<asd>
<param name="..." datatype="dt:int" control="hidden" call-kind="..." data-kind="..."/>
</asd>
<data-engine sp="spLeaveAccrualStatusDetails">
...
</data-engine>
<wia>
...
</wia>
</app-method>
并生成新的 .xml-document(仅选择“app-method”元素)。我正在这样做:(.xsl)
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt">
<xsl:output method="xml" encoding="utf-8" indent="no"></xsl:output>
<xsl:template match="/">
<xsl:for-each select="//app-method">
<xsl:if test='./required-roles/role[@name="administrator"]'>
<xsl:copy-of select="." />
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
它工作得很好,但是.. 没有“xsl:copy-of”有什么办法吗? 认为我需要使用“node-name('blabla')”和 value-of 之类的东西?.. 以及如何选择一组方法参数(不同)? (param name="parameter name"),是的,我需要使用“key”,但找不到好的样本
非常感谢
PS 转换 xml->xml 时我必须使用 Far("xsl in.xml transform.xsl out.xml"),因为尝试从 cdm.exe 执行此操作时出现一些奇怪的错误,我不喜欢 FAR一点点,有没有其他转换xml的方法?
【问题讨论】:
这里有很多问题... Ja! 【参考方案1】:它工作得很好,但是.. 有吗 没有任何方法可以做到这一点 “xsl:副本”?认为我需要使用 类似“节点名称('blabla')”的东西 和价值?..
了解<xsl:element>
指令以及identity rule。
..以及如何选择一组方法 参数(不同)? (参数 name="参数名称"),是的,我需要 使用“钥匙”但找不到好的 带它的样品
这是第二个问题(共三个问题),与第一个问题非常不同。了解 Muenchian grouping。并将其作为一个单独的问题提出。
【讨论】:
【参考方案2】:与众不同
<xsl:key name="pkey" match="param" use="@name"/>
<xsl:template match="/">
<xsl:for-each select='//app-method/asd/param[generate-id() = generate-id(key("pkey", @name)[1])]'>
<parameter>
<xsl:value-of select="@name"/>
</parameter>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
独一无二
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:key name="pkey" match="@name" use="."/>
<xsl:template match="/">
<xsl:for-each select="//app-method/asd">
<xsl:copy-of select='param[@name[generate-id() = generate-id(key("pkey",.)[1])]]'/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
使用 cmd.exe 转换 XML : 下载 MSXSL.exe(最新) 把它放在某个系统文件夹中(已经包含在路径变量中) 然后从命令行 msxsl source.xml transformer.xsl -o result.xml
我明天会写关于没有“复制”的复制
顺便说一句:好Tutorial
【讨论】:
Distinct 和 Unique 之间的区别是什么意思?除了输出格式不同,<parameter>foo</parameter>
vs.<param name="foo">...</param>
,你的代码 sn-ps 不是在做同样的事情吗?以上是关于没有 xsl:copy-of 的 XSLT 复制的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法使用 XSLT 基于 XML 中的元素复制 XML 节点 n 次?
有没有办法使用 XSLT 基于 XML 中的元素复制 XML 节点 n 次?
XslCompiledTransform 中的 XSLT 复制和排序转换引发异常