XSLT:保留一些名称空间的元素

时间:2013-11-05 19:42:14

标签: xml xslt xhtml schema

在我的XML数据库中,我想要一个名为“评论”的元素包含三件事:

  1. 纯文字。
  2. 一些xhtml标签
  3. 一些TEI标签(TEI =文本编码初始化)
  4. 示例:

    <commentary>
    <TEI:persName>King Henry iv</TEI:persName> was an <xhtml:b>important</xhtml:b> person.
    </commentary>
    

    首先:如何在我的XML Schema中声明这一点? (对不起,我发现了这个帖子Allowing certain XHTML tags in an XML Schema?,但它对我没有帮助。)

    然后(我觉得那更复杂)我希望我的xslt(输出:html)执行以下操作:

    将“评论”的所有内容放入“p”元素中,只需取出所有xhtml标记,删除它们的前缀并将它们放入“p”;删除所有TEI标记,但保留其内容。

    所以,预期结果将是:

    <p>
    King Henry iv was an <b>important</b> person.
    </p>
    

2 个答案:

答案 0 :(得分:2)

这是适用于略微改变的xml

的XSLT
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt"
    xmlns:TEI="urn:tei" 
    xmlns:xhtml="http://www.w3.org/1999/xhtml"
    xmlns="http://www.w3.org/1999/xhtml"
    exclude-result-prefixes="msxsl xhtml TEI"
>
    <xsl:output method="html" indent="yes"/>

  <xsl:template match="/">
    <html>
      <body>
      <xsl:apply-templates />
      </body>
    </html>
  </xsl:template>

    <xsl:template match="commentary">
      <p>
        <xsl:apply-templates />
      </p>
    </xsl:template>

  <!-- remove namepace, keep name -->
  <xsl:template match="xhtml:*">
    <xsl:element name="{local-name()}">
      <xsl:value-of select="."/>
    </xsl:element>
  </xsl:template>

  <!-- surpress nodes in a namespace -->
  <xsl:template match="TEI:*">
    <xsl:value-of select="."/>
  </xsl:template>

</xsl:stylesheet>

输入xml:

<?xml version="1.0" encoding="utf-8" ?>
<root xmlns:TEI="urn:tei" xmlns:xhtml="http://www.w3.org/1999/xhtml" >
  <commentary>
    <TEI:persName>King Henry iv</TEI:persName> was an <xhtml:b>important</xhtml:b> person.
  </commentary>
</root>

这是VS2010基于以上xml为我生成的架构

<xs:schema xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:TEI="urn:tei" attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:import namespace="urn:tei" />
  <xs:import namespace="http://www.w3.org/1999/xhtml" />
  <xs:element name="root">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="commentary">
          <xs:complexType mixed="true">
            <xs:sequence>
              <xs:element ref="TEI:persName" />
              <xs:element ref="xhtml:b" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

TEI架构

<xs:schema xmlns:tns="urn:tei" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="urn:tei" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="persName" type="xs:string" />
</xs:schema>

答案 1 :(得分:0)

非常感谢!

经过几分钟的测试后,我发现了一些我能够解决的问题。

XSLT不适用于嵌套属性。我通过简单地替换

解决了这个问题
    <xsl:value-of select="."/>

<xsl:apply-templates />

未处理属性。我为属性添加了for-each-loop:

<xsl:for-each select="./@*">
<xsl:attribute name="{local-name()}"><xsl:value-of select="."/></xsl:attribute>
</xsl:for-each>

代码现在正常用于

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="xhtml and tei.xsl"?>
<root xmlns:tei="urn:tei" xmlns:xhtml="http://www.w3.org/1999/xhtml">
   <commentary>
      <tei:persName>
         <xhtml:b>
            <xhtml:a href="http://en.wikipedia.or/wiki/Henry_IV_of_England">
               <xhtml:span style="font-size:20pt">King Henry iv</xhtml:span>
            </xhtml:a>
         </xhtml:b>
      </tei:persName>
      was an
      <xhtml:b>important</xhtml:b>
      person.
   </commentary>
</root>