XSLT Document()函数导致Saxon Error / Attribute-String无法用作Filepath

时间:2015-10-09 08:20:25

标签: xslt document filepath concat saxon

基本信息是我有一个带ID的元素

我想在文档中使用ID-Attribute() - 函数来提取-element的内容

我有两个问题:

1)我的撒克逊处理器不解决任何修复!我在de Document Function

中提供的文件路径

- >结果:FODC0005文档已标记为不可用:文件路径

问题:为什么???

到目前为止,这是我的代码:

<xsl:template match="pmentry"><xsl:apply-templates/></xsl:template>

<xsl:template match="refdm"><xsl:apply-templates/></xsl:template>

<xsl:element name="datamodule">

<xsl:element name="DMC">DMC-<xsl:value-of select="modelic"/>-<xsl:value-of select="sdc"/>-<xsl:value-of select="chapnum"/>-<xsl:value-of select="section"/><xsl:value-of select="subsect"/>-<xsl:value-of select="subject"/>-<xsl:value-of select="discode"/><xsl:value-of select="discodev"/>-<xsl:value-of select="incode"/><xsl:value-of select="incodev"/>-<xsl:value-of select="itemloc"/>
</xsl:element>

<xsl:element name="CSH">
<xsl:attribute name="ID">DMC-<xsl:value-of select="modelic"/>-<xsl:value-of select="sdc"/>-<xsl:value-of select="chapnum"/>-<xsl:value-of select="section"/><xsl:value-of select="subsect"/>-<xsl:value-of select="subject"/>-<xsl:value-of select="discode"/><xsl:value-of select="discodev"/>-<xsl:value-of select="incode"/><xsl:value-of select="incodev"/>-<xsl:value-of select="itemloc"/></xsl:attribute>

<xsl:value-of  select="document(concat('../XML/',@ID,'.xml'))/dmodule/idstatus/status/remarks"/>
</xsl:element>


</xsl:element>

</xsl:template>

2)我的第二个问题是,我无法弄清楚如何使用我的ID作为文件名

如果有人有小费或其他什么我真的无能为力。

提前致谢

编辑:3文档() - 函数用于测试Saxon开始搜索文档的位置

编辑:

所以我正在使用以下文件夹设置:

Folder Playground:子文件夹XSLT和XML

批处理文件与文件夹处于同一级别

 java -jar XSLT/saxon9he.jar -s:FLARE_Publicationmodul.xml -o:XSLT/remark_list.xml  -xsl:XSLT/read_remarks_part1.xsl 

现在我的计划是生成这个XML文件:

<?xml version="1.0" encoding="utf-8"?>
<list>
<datamodule>
<DMC>DMC-S1000DBIKExsd-AAA-01-00-0000-00A-001A-A</DMC>
<CSH ID="DMC-S1000DBIKExsd-AAA-01-00-0000-00A-001A-A"> Content of the Remarks Element</CSH>
</datamodule>

<datamodule>
<DMC>DMC-S1000DBIKExsd-AAA-D00-00-00-00AA-941A-D</DMC>
<CSH ID="DMC-S1000DBIKExsd-AAA-D00-00-00-00AA-941A-D"> Content of the Remarks Element</CSH>
</datamodule>

...

</list>

所以concat路径应该看起来像这样:

../ XML / DMC-S1000DBIKExsd-AAA-D00-00-00-00AA-941A-D.xml

路径应该是正确的。 Saxon在控制台中打印它们,但缺少@ID信息,或者如果我提供像(../XML/1.xml)这样的固定路径,他会检查文件夹但是找不到文件。

我是否有可能在Saxon9he中启用文档功能?

或者是否有其他解决方案从其他文件中提取元素内容?

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

文档(更确切地说,URI)被标记为不可用&#34;在两种情况下:

(1)你调用提供该URI的doc-available(),答案是假的

(2)你调用提供该URI的doc()或document(),并发生错误。

在情况(2)中,您通常会在第一次尝试访问URI时看到原始失败,因此除非您使用try / catch来抑制错误,否则这不太可能。样式表是否使用doc-available()?

您的实验似乎表明您还没有弄清楚如何解析相对URI。 document()的规则是:

  • 如果您提供节点,例如document(@ID),那么@ID中的相对URI将根据找到该节点的元素的基URI进行解析(即,通常是转型的源文件)

  • 如果提供字符串,例如concat(@ID,&#39; .xml&#39;),则会根据样式表的基URI解析相对URI。

例如,您可以通过输出base-uri(。)来检查源文档的基URI。您可以使用static-base-uri()检查样式表的基URI。有时会出现问题,因为基本URI不为人所知;例如,如果转换的输入是作为DOM提供的话,就会发生这种情况。

我希望这可以帮助你前进。如果您仍有问题,我们需要知道

(a)document()的参数是什么

(b)源文档和样式表的基本URI是

(c)您希望阅读的文件的完整路径是什么

答案 1 :(得分:0)

我认为,这是撒克逊人的错误。

但是有解决方法:-):

    <xsl:function name="fix:doc" as="document-node()?" visibility="final">
        <xsl:param name="fix:uri" as="xs:string?" required="yes"/>
        <xsl:if test="exists( $fix:uri )">
            <xsl:source-document href="{ $fix:uri }">
                <xsl:sequence select="/"/>
            </xsl:source-document>
        </xsl:if>
    </xsl:function>