【发布时间】:2020-02-18 08:21:07
【问题描述】:
我需要计算一些值并将它们存储在一个变量中。我将一个文档节点传递给xsl:apply-templates 并指定模式:
<xsl:variable as="xs:string*" name="checkAccidentalsVisibility">
<xsl:apply-templates mode="checkAccidentalsVisibility" select="$extractMainVersion"/>
</xsl:variable>
但是这个模式的模板不匹配:
<xsl:template match="body//@accid[not(parent::accid/@func[. = 'caution'] or ancestor::note[@grace])]" mode="checkAccidentalsVisibility" >...
身份转换模板是这样指定的,bcs我不需要复制xml树。
<xsl:template match="node() | @*" mode="extractMainVersion changeAccid">
<xsl:copy>
<xsl:apply-templates mode="#current" select="node() | @*"/>
</xsl:copy>
</xsl:template>
$checkAccidentalsVisibility 的值是文本节点。例如,应用于这个 XML 我得到 一个例子:
<?xml version="1.0" encoding="UTF-8"?>
<mei meiversion="3.0.0" xml:id="dme92517025-f4c2-4231-a1c3-b70f02802d61" xmlns="http://www.music-encoding.org/ns/mei">
<meiHead meiversion="3.0.0">
<fileDesc>
<titleStmt>
<title label="NMA digital" type="unit">an example</title>
</titleStmt>
<pubStmt/>
</fileDesc>
</meiHead>
<music meiversion="3.0.0">
<body>
<mdiv n="2a" xml:id="mdiv_">
<score xml:id="score_">
<section label="menuetto_A" xml:id="section_A_m1-5">
<measure n="1" xml:id="m1_k_">
<staff n="1" xml:id="staff_108">
<layer n="1" xml:id="layer_114">
<note accid.ges="f" dur="2" oct="4" pname="e" tstamp="1" xml:id="note_120"/>
<choice xml:id="choice_132">
<sic xml:id="corr_132">
<note dur="4" oct="4" pname="e" tstamp="3" xml:id="note_132">
<accid accid="f" xml:id="accid_138"/>
</note>
</sic>
<orig xml:id="orig_132">
<note dur="4" oct="4" pname="e" tstamp="3" xml:id="note_132b">
<accid accid="f" xml:id="accid_138b"/>
</note>
</orig>
</choice>
</layer>
</staff>
</measure>
</section>
</score>
</mdiv>
</body>
</music>
</mei>
我期待一系列 @xml:id-values 我从我的计算中得出的。
【问题讨论】:
-
XML 元素位于命名空间
xmlns="http://www.music-encoding.org/ns/mei"中,在使用xpath-default-namespace="http://www.music-encoding.org/ns/mei"的XSLT 中是否考虑了该命名空间? -
是的,这是默认命名空间。我刚刚意识到我只能匹配元素,但不能匹配属性。例如,match="body" 可以正常工作,但 match="@accid" 甚至 match="@*" 什么都不选择。
-
我建议您将代码示例减少到最少但完整的示例,以便其他人重现问题。不清楚输入是什么,变量
$extractMainVersion绑定在哪里以及如何绑定,不同模式是如何使用的。 -
在变量声明中给出
as="xs:string*",声称“$checkAccidentalsVisibility 的值是文本节点”似乎很奇怪,字符串序列不是文本节点。