XSLT与命名空间匹配

时间:2017-05-14 01:51:50

标签: python xml xslt xpath lxml

我正在尝试使用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 
作为这种转变的结果。

我在这里缺少什么?

1 个答案:

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