没有xsl:copy-of的XSLT复制

时间:2010-10-21 09:24:42

标签: xml xslt copy key distinct

我有一些* .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文档(仅选择“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 =“参数名称”),是的我需要使用“密钥”,但用它找不到好的样本

非常感谢

PS转换xml-&gt; xml时我必须使用Far(“xsl in.xml transform.xsl out.xml”),因为尝试从cdm.exe执行时有一些奇怪的错误,我不喜欢FAR一点点,还有另一种转换xmls的方法吗?

2 个答案:

答案 0 :(得分:2)

  

它工作得很好,但是..有   任何方式没有   “XSL:复制的”?认为我需要使用   像“node-name('blabla')”之类的东西   和价值?..

了解<xsl:element>指令以及identity rule

  

..以及如何选择一组方法   参数(不同)? (param   name =“参数名称”),是的,我需要   用“钥匙”但找不到好处   带样品

这是第二个问题(三分之一),与第一个问题截然不同。阅读 Muenchian grouping 。并将其作为一个单独的问题。

答案 1 :(得分:1)

鲜明
        

    <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

相关问题