0

タイトルがあいまいすぎる場合は、事前に申し訳ありません。

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 は初めてなので、どうすればよいかわかりません。

編集:

エラーが見つかったときにファイルのパスを表示する必要がありますが、最初のエラーが見つかった後に一度だけ表示する必要があります。エラーは、図要素を含むファイルでのみ見つかります。

これで私の問題が明確になることを願っています。

4

1 に答える 1

0

次のようなものを使用して、現在の要素が XML の前の要素と一致するかどうかをテストできます。

<variable name='currentlocation' select="@href"/>
<xsl:if test="not(preceding-sibling::topicref[contains(@href, $currentlocation)])">

 (process this only if there is no preceding sibling with the same @href as the current location)

編集: このテストでは、問題の半分しか解決できません。他のファイルにエラーがあるかどうかを確認するには、別のテストが必要です。

于 2013-10-03T13:22:16.533 に答える