タイトルがあいまいすぎる場合は、事前に申し訳ありません。
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 は初めてなので、どうすればよいかわかりません。
編集:
エラーが見つかったときにファイルのパスを表示する必要がありますが、最初のエラーが見つかった後に一度だけ表示する必要があります。エラーは、図要素を含むファイルでのみ見つかります。
これで私の問題が明確になることを願っています。