我想把一个带有规范的xml文件转换成另一个规范。所以理论上所有<元素>和@attributes是已知的。但有一点可以预见的是,该文件中存在不符合标准的手写信息。 我做了以下事情:
<tasklist>
<task1 enabled="true">
<param>123</param>
</task1>
<task2 enabled="true">
<param>123</param>
</task2>
<randomhandwritten>some important information</randomhandwritten>
</tasklist>
<?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
一些重要信息
我无法理解为什么所有元素内容都显示在一个匹配中?有人可以告诉我如何省略最后一场比赛,或者我应该接受它,它是怎么回事?
答案 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())"/>...
会输出一条消息,分别显示匹配的节点名称。