如果标题太模糊,请提前道歉。
我必须使用 XSLT 处理相互引用的几个 XML 文件并搜索某些错误。
我的 XML 通常如下所示:
<topic>
... some elements ...
<topicref @href="path-to-another-file"/>
... some other elements ...
<figure> ... </figure>
</topic>
我想要的输出是:
path-to-a-file:
Errors found
path-to-another-file:
Other errors found
我从 href 属性中获取路径,如果相应的文件中有错误,我想打印一个路径。
我的 XSLT 的重要部分:
<!-- ingress referenced files -->
<xsl:template match="//*[@href]">
<xsl:apply-templates select="document(@href)/*">
<xsl:with-param name="path" select="@href"/>
</xsl:apply-templates>
<xsl:apply-templates select="./*[@href]">
</xsl:apply-templates>
</xsl:template>
<!-- matching topic elements to check -->
<xsl:template match="topic">
<xsl:param name="path"/>
<xsl:if test=".//figure">
<!-- Right now this is where I print the path of the current file -->
<xsl:value-of select="$path"/>
</xsl:if>
<xsl:apply-templates select="figure">
<xsl:with-param name="path" select="$path"/>
</xsl:apply-templates>
</xsl:template>
<!-- check if there's any error -->
<xsl:template match="figure">
<xsl:param name="path"/>
<xsl:if test="...">
<xsl:call-template name="printError">
<xsl:with-param name="errorText" select="'...'"/>
<xsl:with-param name="filePath" select="..."/>
<xsl:with-param name="elementId" select="..."/>
</xsl:call-template>
</xsl:if>
<xsl:if test="...">
<xsl:call-template name="printError">
<xsl:with-param name="errorText" select="'...'"/>
<xsl:with-param name="filePath" select="..."/>
<xsl:with-param name="elementId" select="..."/>
</xsl:call-template>
</xsl:if>
</xsl:template>
<!-- print error message -->
<xsl:template name="printError">
<xsl:param name="errorText"/>
<xsl:param name="filePath"/>
<xsl:param name="elementId"/>
... print out some stuff ...
</xsl:template>
我应该在哪里打印文件的路径?通过这种转换,如果文件有图形元素,即使它不包含任何错误,我也会将其写出来。像这样:
path-to-a-file:
Errors found
path-to-file-with-no-errors:
path-to-another-file:
Other errors found
如果我将有问题的部分放在其他地方(即在错误检查或打印模板中),它会在检查每个图形元素或打印错误后打印。
我认为这个问题可以用变量来解决,但我是 XSLT 的新手,所以我不知道该怎么做。
编辑:
当我在文件中发现错误时,我需要显示文件的路径,但只有一次,在发现第一个错误之后。错误只能在具有图形元素的文件中找到。
我希望这能澄清我的问题。