在我的XML数据库中,我想要一个名为“评论”的元素包含三件事:
示例:
<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>
答案 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>