当前位置: 首页 > 知识库问答 >
问题:

XSLT Document()函数导致Saxon错误/属性字符串不能用作Filepath

解阳荣
2023-03-14

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

我想使用文档()-函数中的ID-属性来提取-元素的内容

我这里有两个问题:

1) 我的saxon处理器无法解决任何问题!de Document函数中我提供的文件路径

--

问题:为什么???

这是我目前的代码:

<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 document()-函数用于测试Saxon开始搜索文档的位置

编辑:

所以我在以下文件夹设置中工作:

文件夹游乐场:子文件夹XSLT和XML

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

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

现在我的计划是生成这个XML-File:

<?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个答案

薛望
2023-03-14

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

但有解决方法:-):

    <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>
傅安宁
2023-03-14

文档(更准确地说,URI)在两种情况下被“标记为不可用”:

(1) 调用doc-available()提供该URI,结果为false

(2)您调用提供该URI的doc()或Document(),然后发生错误。

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

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

>

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

    如果您提供一个字符串,例如concat(@ID,'. xml'),则相对URI将根据样式表的基URI解析。

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

    我希望这能帮助你前进。如果你还有问题,我们需要知道

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

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

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

  •  类似资料:
    • ActivationFunction.java:6:错误:不兼容类型:double无法转换为字符串r=double.ParseDouble(r);^ActivationFunction.java:8:错误:不兼容类型:如果(double.isNaN(x))返回r,则字符串无法转换为double;^

    • 如果要筛选列值中包含字符串的行,可以使用类似于(前面回答:检查pandas dataframe列中的字符串是否在列表中,或者检查字符串是否在pandas dataframe中)。 但是,我的查找列包含emtpy单元格。因此,

    • 问题内容: 当前模式与功能之一不同时,属性表示法函数调用会出错。 我创建了一个函数 我正在尝试使用docs中描述的带有属性符号的函数: 但是收到一条错误消息: 使用功能符号的查询可以正常工作: 数据库已通过备份/还原从PostgreSQL 10迁移。 给出: UPD 。发现如果我将架构设置为默认值,则可以正常工作。 问题答案: 您自己找到了问题的根源。确切地说:函数的模式必须在current中的

    • 问题内容: 我在下面的代码块上收到此错误。 我还发现了表明存在功能的链接。 http://definitelytyped.org/docs/typescript-services-- typescriptServices/classes/typescript.stringutilities.html 我会错过一些文件吗? 问题答案: 是ES6函数,因此您需要以TypeScript编译器设置为目标,

    • 请你帮忙。为什么昵称对象中的字符串(150)会出现奇怪的错误? 类型错误:续集。字符串不是对象上的函数。(E:\Projects\JavaScript\couponsystem\src\models\schema.js:21:22)位于模块_在对象处编译(internal/modules/cjs/loader.js:688:30)。模块_扩展。。模块处的js(internal/modules/cj