没有 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')”的东西 和价值?..

了解&lt;xsl:element&gt; 指令以及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 之间的区别是什么意思?除了输出格式不同,&lt;parameter&gt;foo&lt;/parameter&gt; vs.&lt;param name="foo"&gt;...&lt;/param&gt;,你的代码 sn-ps 不是在做同样的事情吗?

以上是关于没有 xsl:copy-of 的 XSLT 复制的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法使用 XSLT 基于 XML 中的元素复制 XML 节点 n 次?

有没有办法使用 XSLT 基于 XML 中的元素复制 XML 节点 n 次?

XSLT - 根据其他属性的值复制某些属性

XslCompiledTransform 中的 XSLT 复制和排序转换引发异常

如何使用 XSLT 复制 XML 以生成相同形式的另一个新 XML

通过xslt一步复制和操作xml元素