我有以下xml代码,类似地跨多个文件构建:
00000010
我需要生成指向.html文件的链接,该文件的名称与上图相同。我在XQuery中这样做的代码如下:
<surface n="verso">
<label>Folio 42 Verso</label>
<graphic url="British_Library_Harley_2251_f42v.jpg"/>
<zone n="EETS.QD.I">
<line n="l.1">
<orig><hi rend="red_pilcrow">¶</hi><hi rend="underline">Quis dabit capite meo fonte<ex>m </ex>lacrima<ex>rum</ex></hi></orig>
</line>
</zone>
</label>
</surface>
$ l表示单独的行,因此&lt; line&gt;的位置。上面的元素。 $ t和$ m的值在另一个let语句中生成,在这种情况下等于&#34; Quis_Dabit&#34;和#34; British_Library_Harley_2251,&#34;分别。所以$ g应该等于&#34; Quis_Dabit / British_Library_Harley_2251 / British_Library_Harley_2251_f42v.html&#34;但我只是在最后得到.html:&#34; Quis_Dabit / British_Library_Harley_2251 / .html。&#34;该缺陷似乎在我的substring-before语句中,但它没有显示关于tei:graphic(name(),@ url等)的任何内容,如果我包含它而不是tei:graphic,它会显示@n元素。 。所以我有点失落。我如何正确地形成子串 - 并且有人可以向我解释逻辑在哪里搞砸了所以我不会再次遇到这个错误?
答案 0 :(得分:0)
你的表达:
let $g := concat($t, "/" , $m, "/", substring-before($l/../../tei:graphic/@url,"."),".html")
正如所写,这不是一个完整或有效的XQuery或XPath表达式,但我们假设它是更大声明的一部分。
让我们简化一下:
let $g := substring-before($l/../../tei:graphic/@url,".")
现在让我们假设您的变量$l
已正确设置为您所说的节点
let $g := substring-before(//line[@n="l.1"]/../../tei:graphic/@url,".")
我们假设输入XML中的元素graphic
确实位于tei
绑定的命名空间中(为简单起见,在下面的在线测试中删除)。
现在,让我们修复你的XML(它的格式不正确)。如果自动关闭标签是正确的,这是您的XML的可能版本:
<surface n="verso">
<label>Folio 42 Verso</label>
<graphic url="British_Library_Harley_2251_f42v.jpg"/>
<zone n="EETS.QD.I">
<line n="l.1">
<orig><hi rend="red_pilcrow">¶</hi><hi rend="underline">Quis dabit capite meo fonte<ex>m </ex>lacrima<ex>rum</ex></hi></orig>
</line>
</zone>
</surface>
这是一种非常误导性的缩进XML方法(你让我上当了!),我更喜欢这样的父/子缩进,更清楚:
<surface n="verso">
<label>Folio 42 Verso</label>
<graphic url="British_Library_Harley_2251_f42v.jpg" />
<zone n="EETS.QD.I">
<line n="l.1">
<orig>
<hi rend="red_pilcrow">¶</hi>
<hi rend="underline">Quis dabit capite meo fonte<ex>m </ex>lacrima<ex>rum</ex></hi>
</orig>
</line>
</zone>
</surface>
此表达式可以是tested with your input automatically here, at XPathTester。
如您所见,它返回正确的字符串。您的XPath或XQuery技能没有任何问题:)。
所以你的错误要么是没有关注line
元素,graphic
元素不在所述命名空间中,要么你没有显示的其他错误。