我正在尝试使用Python 3.6和lxml(这意味着XSLT 1.0和XPath 1.0)从RelaxNG定义构建bottle.py模板。我找不到获取起始模板名称的技巧,在这个例子中是#Address;地址簿'。我需要来自 rng:grammar / rng:start / rng:start / rng:ref / @ name 而不是 rng:define / @ name 。
<?xml version="1.0" ?>
<grammar xmlns="http://relaxng.org/ns/structure/1.0">
<start>
<ref name="AddressBook"/>
</start>
<define name="AddressBook">
<element name="addressbook">
<zeroOrMore>
<element name="card">
<element name="name">
<text/>
</element>
<element name="email">
<text/>
</element>
</element>
</zeroOrMore>
</element>
</define>
</grammar>
这是我的xslt:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:rng="http://relaxng.org/ns/structure/1.0"
exclude-result-prefixes="rng">
<xsl:output type="text"/>
<xsl:template match="/">
<div>start
<xsl:apply-templates select="rng:start"/>
done</div>
</xsl:template>
<xsl:template match="rng:start">
<div>Start
<h1><xsl:value-of select="rng:ref/@name" /></h1>
End</div>
</xsl:template>
第一场比赛有效,我得到
Start End作为这种转变的结果。
我在这里缺少什么?
答案 0 :(得分:0)
您的问题不是名称空间,而是路径。你的指示:
<xsl:apply-templates select="rng:start"/>
不执行任何操作,因为start
不是当前节点的子节点(与/
匹配的<xsl:template match="/">
根节点)。
将其更改为:
<xsl:apply-templates select="rng:grammar/rng:start"/>
或 - 最好是恕我直言 - 从:
开始<xsl:template match="/rng:grammar">
P.S。 xsl:output
获取method
属性,而非type
。如果您要输出XML / HTML,请不要使用输出方法text
。