从xml中提取(模式)标记

从xml中提取(模式)标记,xml,xsd,schema,Xml,Xsd,Schema,我有一个xml文件,其中包含模式信息。为了验证xml,我想提取模式信息。如何通过phyton脚本或xslt转换实现这一点?验证将在nifi xmlValidator处理器中进行 我尝试了xsl转换,但xsd前缀是问题所在 <?xml version="1.0" encoding="UTF-8"?> <root xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:od="urn:schemas-microsof


我有一个xml文件,其中包含模式信息。为了验证xml,我想提取模式信息。如何通过phyton脚本或xslt转换实现这一点?验证将在nifi xmlValidator处理器中进行

我尝试了xsl转换,但xsd前缀是问题所在

    <?xml version="1.0" encoding="UTF-8"?>
    <root xmlns:xsd="http://www.w3.org/2001/XMLSchema"   xmlns:od="urn:schemas-microsoft-com:officedata">
    <xsd:schema>
    <xsd:element name="dataroot">
    <xsd:complexType>
    <xsd:choice maxOccurs="unbounded">
      <xsd:element ref="AE"></xsd:element> 
   ...
    </xsd:schema> 
    <dataroot>
   ...</dataroot>
   </root>

...
...

您可以使用以下XSLT-1.0样式表从中提取XSD部分。首先,它匹配
/root
元素,然后使用自定义标识模板复制所有
xsd:…
子元素:


结果是:

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="dataroot">
    <xsd:complexType>
      <xsd:choice maxOccurs="unbounded"><xsd:element ref="AE"/>

                    ...
                </xsd:choice>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

...

我忽略了
,因为它们可能不是XML的一部分。

下面的XSLT 2.0样式表将文档拆分为模式文档和实例文档

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="2.0"> 

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()" />
        </xsl:copy>
    </xsl:template>  

    <xsl:template match="xsd:schema">
        <xsl:result-document href="schema.xsd">
            <xsl:copy-of select="." />
        </xsl:result-document>
    </xsl:template>  

</xsl:stylesheet>


有没有办法只保留模式?当然有,但你在这里问的是非常基本的问题:你读了什么,尝试了什么,遇到了什么困难?我想用提取的模式来验证xml数据,这有意义吗?我明白你想做什么,我不知道您在处理过程中遇到了什么困难。我尝试了没有第一个模板的版本,只有match=“xsd:schema”部分,没有对结果文档的引用,现在我遇到了一个问题,即删除的标记的值仍然位于文档的末尾,可以删除这些吗?我不确定我是否理解正确,但要获取
dataroot
部分,请从标识模板中删除这两个
mode=“xsd”
,然后用
替换另一个模板。我尝试了您的版本,但在转换的xml的最后一行,dataroot标记中有已删除标记的值。是否可以删除这些值?好的,添加模板
以消除多余的文本节点。我需要再做一次修改,名为“od:index”的xsd:schema的子元素不应复制,这是可能的吗?添加命名空间
xmlns:od=“urn:schemas microsoft com:officedata”
到样式表元素,然后添加一个空模板,如下所示:
删除“od:index”元素或
删除所有“od:…”元素。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="2.0"> 

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()" />
        </xsl:copy>
    </xsl:template>  

    <xsl:template match="xsd:schema">
        <xsl:result-document href="schema.xsd">
            <xsl:copy-of select="." />
        </xsl:result-document>
    </xsl:template>  

</xsl:stylesheet>