XSLT:识别<xsl:copy>是否执行了某些操作</xsl:copy>

时间:2015-01-23 14:50:30

标签: xml xslt copy warnings

我想把一个带有规范的xml文件转换成另一个规范。所以理论上所有&lt;元素&gt;和@attributes是已知的。但有一点可以预见的是,该文件中存在不符合标准的手写信息。 我做了以下事情:

XML的文件

<tasklist>
   <task1 enabled="true">
      <param>123</param>
   </task1>
   <task2 enabled="true">
      <param>123</param>
   </task2>
   <randomhandwritten>some important information</randomhandwritten>
</tasklist>

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" exclude-result-prefixes="msxsl">
    <xsl:output method="xml" indent="yes"/>
       <xsl:template match="@* | node()">

        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
            <xsl:message>Match <xsl:copy-of select="."/> </xsl:message>
        </xsl:copy>
    </xsl:template>


<xsl:template match="tasklist/task1">
    <xsl:variable name="content" select="param"/>
    <screen enabled="true" param="{$content}"/>
</xsl:template>

<xsl:template match="tasklist/task2">
    <xsl:variable name="content" select="param"/>
    <printer enabled="true" param="{$content}"/>
</xsl:template>

</xsl:stylesheet>

通常,不会有任何手写元素,因此所有工作都是通过模板完成的,副本不应该做任何事情。但是如果有人DID在其中写入元素,有没有办法警告我的XSL-File用户复制方法实际上做了什么? 否则我会在没有复制方法的情况下应用相同的脚本,如果它们输出相同的输出则比较它们,但那样......有点脏。

非常感谢! reineke

编辑: 感谢您对xsl:message的帮助!! 通过显示的XSL-File,我得到了

的输出
  

匹配一些重要信息

也适用于

  

匹配

     

123

     

123

     

一些重要信息

我无法理解为什么所有元素内容都显示在一个匹配中?有人可以告诉我如何省略最后一场比赛,或者我应该接受它,它是怎么回事?

1 个答案:

答案 0 :(得分:0)

要让XSLT输出除结果文档之外的其他内容,您可以在XSLT 1.0 http://www.w3.org/TR/xslt#message中使用<xsl:message>...</xsl:message>,在XSLT 2.0 http://www.w3.org/TR/xslt20/#message中使用<xsl:message select="..."/>。< / p>

因此<xsl:template match="node()"><xsl:message>Match on <xsl:copy-of select="."/></xsl:message>...<xsl:template match="node()"><xsl:message select="concat('Match on ', name())"/>...会输出一条消息,分别显示匹配的节点名称。