2010-05-20 99 views
1

我正在使用XSLT 2.0来转换XML架构。第一个模式(s1.xsd)进口第二架构(s2.xsd)如下:使用XSLT合并两个xml架构

s1.xsd

<schema xmlns="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema.xsd" 
    xmlns:ns1="URI1" targetNamespace="URI2" 
    elementFormDefault="qualified" attributeFormDefault="unqualified"> 
    <import namespace="URI1" schemaLocation="s2.xsd"/> 
    <element name="element1"/> 
    <element name="element2"/> 
</schema> 

和s2.xsd的内容的内容

<schema xmlns="http://www.w3.org/2001/XMLSchema" 
    xmlns:ns1="URI1" targetNamespace="URI1"> 
    <attribute name="attr1"/> 
<schema> 

我XSLT声明XS命名空间如下:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

我想s2.xsd的节点合并到<架构>-s1.xsd的元素。到目前为止,我已经试过

<xsl:template name="merge_imported_schemas"> 
    <xsl:for-each select="/schema/import[@namespace = //namespace::*]"> 
     <!-- file exists? --> 
     <xsl:choose> 
      <xsl:when test="boolean(document(@schemaLocation))"> 
       <!-- schema found --> 
       <xsl:copy-of select="document(@schemaLocation)/*/node()"/> 
      </xsl:when> 
      <xsl:otherwise> 
       <!-- schema not found --> 
       <xsl:message terminate="yes"> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:for-each> 
</xsl:template> 

,但我没有得到期望的结果。任何人都可以告诉我我做错了什么?我怀疑这里有一个命名空间冲突,但老实说,我发现使用命名空间有点混乱。谢谢!

+0

我真正想要的是将s2.xsd的内容附加到s1.xsd,然后将s1.xsd解析为单个文件。据我所知,这是不可能的,但是解决方法包括使用临时结果树(请参阅http://www.xml.com/pub/a/2003/12/03/tr.html) 。为实现这一点,调用似乎有伎俩。 – conciliator 2010-05-20 14:14:07

回答

2

您需要限定XPath中的元素。目前select="/schema/import[@namespace = //namespace::*]">根本不匹配任何东西,因为没有元素/schema。 XPath试图与名称空间中的元素匹配。

更改为select="/xs:schema/xs:import[@namespace = //namespace::*]">,它应该工作。请记住,名称空间前缀是名称空间URI的别名,并且如果您有一个默认名称空间(如在xsd文件中),那么不带前缀的元素仍然具有名称空间限定的名称空间。

顺便说一句,您可以使用<xsl:apply-templates select="/xs:schema/node()"代替<xsl:for-each select="/schema/import[@namespace = //namespace::*]">,并为要复制到输出树的不同类型的节点定义不同的模板。

+0

谢谢保罗,我忘了。 :)在用正确的命名空间前缀扩充XPath查询之后,我决定尝试计算节点数量。像这样: Before: After: conciliator 2010-05-20 13:01:11

+0

从给出的信息看来,您可能会丢弃原始模式中的元素。 – 2010-05-20 13:06:44

+0

好吧,那可能就是这样。然而,我用更改了(在s2中计算/ schema下的元素数目)。 XSD)。它说22 ...我很失落。 – conciliator 2010-05-20 13:17:52