15

これについて Java と C を参照する多くの例を見つけましたが、XSL を使用して外部ファイルの存在を確認するにはどうすればよいですか、または確認できますか。

まず、これは単なるスニペットであることに気付きましたが、これは巨大なスタイルシートの一部であるため、私の問題を示すのに十分であることを願っています.

    <!-- Use this template for Received SMSs -->
<xsl:template name="ReceivedSMS">
    <!-- Set/Declare "SMSname" variable (local, evaluates per instance) -->
    <xsl:variable name="SMSname">
        <xsl:value-of select=" following-sibling::Name"/>
    </xsl:variable>
    <fo:table font-family="Arial Unicode MS" font-size="8pt" text-align="start">
        <fo:table-column column-width=".75in"/>
        <fo:table-column column-width="6.75in"/>
        <fo:table-body>
            <fo:table-row>
                <!-- Cell contains "speakers" icon -->
                <fo:table-cell display-align="after">
                    <fo:block text-align="start">
                        <fo:external-graphic src="../images/{$SMSname}.jpg" content-height="0.6in"/>

私がやりたいことは、{$SMSname}.jpg行を囲む「if」ステートメントに入れられます。あれは:

                     <fo:block text-align="start">
                        <xsl:if test="exists( the external file {$SMSname}.jpg)">
                            <fo:external-graphic src="../images/{$SMSname}.jpg" content-height="0.6in"/>                            
                        </xsl:if>
                        <xsl:if test="not(exists( the external file {$SMSname}.jpg))">
                            <fo:external-graphic src="../images/unknown.jpg" content-height="0.6in"/>                            
                        </xsl:if>
                    </fo:block>                       

「グループ化」などのため、XSLT 2.0 を使用しています。これが実現できることを願っています。それが単純なものであることをさらに願っています。

いつものように、助けてくれてありがとう。LO

4

10 に答える 10

11

この古い質問に出くわす可能性のある他の人のために、インターネット上のさまざまなソースからの情報をつなぎ合わせて、ファイルが存在するかどうかを確認するために Java 拡張機能を使用する次の XSLT2 関数を思い付きました。

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:java="http://www.java.com/"
  exclude-result-prefixes="java xs">

  <xsl:function name="java:file-exists" xmlns:file="java.io.File" as="xs:boolean">
    <xsl:param name="file" as="xs:string"/>
    <xsl:param name="base-uri" as="xs:string"/>

    <xsl:variable name="absolute-uri" select="resolve-uri($file, $base-uri)" as="xs:anyURI"/>
    <xsl:sequence select="file:exists(file:new($absolute-uri))"/>
  </xsl:function>

</xsl:stylesheet>

その後、次のように関数を使用できます。

<xsl:if test="java:file-exists($filename, base-uri())">
  <!-- ... -->
</xsl:if>

これは、少なくとも Saxon 9.1.0.5J で動作します — 他の XSLT プロセッサではテストしていません。

: 存在を確認しているファイルが XML ファイルであり、XSLT2 を使用している場合は、組み込みdoc-available()関数も使用できます。

<xsl:if test="doc-available('hello_world.xml')">
  <!-- ... -->
</xsl:if>
于 2013-01-14T17:53:53.760 に答える
10

いいえ、これは XSLT 2.0/XPath 2.0 を使用して行うことはできません。

XSLT 2.0 関数unparsed-text-available()は、テキスト ファイルの検索にのみ適しています。指定された URI を持つテキスト ファイルが存在する場合でも、この関数は false() を返すことがあります。許可された文字のみが含まれています。

仕様から

「unparsed-text-available 関数は、同一の引数を持つ unparsed-text 関数の呼び出しが文字列を返すかどうかを決定します。

最初の引数が空のシーケンスの場合、関数は false を返します。2 番目の引数が空のシーケンスの場合、関数は 2 番目の引数が省略されたかのように動作します。

それ以外の場合、関数は、同じ引数を持つ unparsed-text の呼び出しが成功する場合は true を返し、同じ引数を持つ unparsed-text の呼び出しが回復不可能な動的エラーで失敗する場合は false を返します。

ノート:

これには、unparsed-text-available 関数が実際に URI によって識別されるリソースの読み取りを試行し、それが正しくエンコードされており、XML で無効な文字が含まれていないことを確認する必要があります」

引用終わり。

于 2010-05-27T01:25:58.497 に答える
3

他の誰かがそれを必要としており、fop を使用している場合に備えて、この回答を共有したいと思います。

私は解決策を見つけました:

<xsl:when test="fs:exists(fs:new('myfile.html'))" xmlns:fs="java.io.File">
    <!-- do something here... -->
</xsl:when>

XSLT 1.0 または 2.0 とは独立して動作します。

于 2015-09-02T18:57:46.277 に答える
2

提案されたFile Module EXPath 仕様file:exists()は、標準の XPath 拡張関数として、この (仕様内) などのファイル システム関数をサポートします。このための XSLT 実装はまだありませんが、注目に値します。

于 2010-05-27T09:19:32.917 に答える
2

編集: unparsed-text-available function を使用します。これはxslt 2.0の一部ですが、XQuery またはスタンドアロン XPath ではありません。

以前の回答をここに残したので、不確実性の軌跡をたどることができます...

標準関数を使用して XSLT でこれを行う方法があるとは思いません。ここで説明されているように、Java の拡張関数を使用してそれを行うことができます。

unparsed-text-available関数がありますが、これが標準の関数かどうかはわかりません。Zvonでの使用例があります。unparsed-text-available はここで xslt 2.0 の一部として言及されており、Saxon でサポートされています。

于 2010-05-27T00:02:21.240 に答える
0

これは、標準の XSLT だけで行うことはできません。拡張機能または面倒な回避策を使用する必要があります。拡張関数を使用する方法は 2 つあります。カスタム関数に標準の java/.NET を使用する (Saxon、AltovaXML などの一部のバージョンで動作)、または saxon:file-last-modified() などのプロセッサ固有の拡張関数を使用する。 / saxon:last-modified() . ここでいくつかのサンプル コードを見つけることができます。intern:file-exists() を探してください。

拡張関数を使用できない場合は、ファイル システムに関する情報を含む XML ファイルを外部で生成してスタイルシートに渡すか、バイナリ イメージを SVG 内にラップしてから fn:doc-available() を使用することができます。

于 2011-11-05T09:00:17.640 に答える
0

XML ファイルの存在を確認する必要がある場合は、外部エンティティとインライン doctype を使用します。

<!DOCTYPE foo [ <!ENTITY bar SYSTEM "baz.xml"> ]>

次に、エンティティをスタイルシートに追加します。

&bar;

ファイルが見つからない場合、プロセッサはタイムアウトします。

ファイルが存在することはわかっているが、多くのファイルから 1 つを動的にロードしたい場合は、concat関数とchoose/whenブロックを使用します。

<xsl:variable name="page_name">
<xsl:choose>
  <xsl:when test="$page = 1">
    <xsl:value-of select="'page1.xml'"/>
  </xsl:when>
  <xsl:when test="$page = 2">
    <xsl:value-of select="'page2.xml'"/>
  </xsl:when>
  <!--...-->
  <xsl:when test="$page = 9">
    <xsl:value-of select="'page9.xml'"/>
  </xsl:when>
  <xsl:when test="$page = 10">
    <xsl:value-of select="'page10.xml'"/>
  </xsl:when>
  <xsl:otherwise>
    <xsl:value-of select="'page0.xml'"/>
  </xsl:otherwise>
</xsl:choose>
</xsl:variable>

<xsl:variable name="agree" select="document(concat('include/pages/',$page_name))//processing-instruction()"/>

参考文献

于 2013-09-12T06:49:35.097 に答える