【问题标题】:Extract (schema) tags from xml从 xml 中提取(模式)标签
【发布时间】:2019-11-05 04:10:16
【问题描述】:


我有一个 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>

【问题讨论】:

    标签: xml xsd schema


    【解决方案1】:

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

    <?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="1.0"> 
        <xsl:output method="xml" indent="yes" />
        <xsl:strip-space elements="*" />
    
        <!-- Identity template for 'xsd' -->
        <xsl:template match="@*|node()" mode="xsd">
            <xsl:copy>
                <xsl:apply-templates select="@* | node()" mode="xsd" />
            </xsl:copy>
        </xsl:template>  
    
        <xsl:template match="/root/xsd:schema">
            <xsl:copy>
                <xsl:apply-templates select="@* | node()" mode="xsd" />
            </xsl:copy>
        </xsl:template>         
    
        <xsl:template match="text()" />
    </xsl:stylesheet>
    

    结果是:

    <?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 的一部分。

    【讨论】:

    • 我不确定我是否理解正确,但要获得dataroot 部分,请从身份模板中删除mode="xsd",然后将另一个模板替换为&lt;xsl:template match="/root/xsd:schema" /&gt;
    • 我试过你的版本,但是在转换后的xml的最后一行,dataroot标签内有已删除标签的值。是否可以删除这些值?
    • 好的,添加模板&lt;xsl:template match="text()" /&gt; 去掉多余的文本节点。
    • 我需要再修改一下,xsd:schema的子元素“od:index”应该被排除在复制之外,这可能吗?
    • 将命名空间xmlns:od="urn:schemas-microsoft-com:officedata" 添加到样式表元素,然后添加一个空模板,如下所示:&lt;xsl:template match="od:index" mode="xsd" /&gt; 删除“od:index”元素或&lt;xsl:template match="*[namespace-uri() = 'urn:schemas-microsoft-com:officedata']" mode="xsd" /&gt; 删除所有“od:. .." 元素。
    【解决方案2】:

    以下 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" 部分,没有对结果文档的引用,现在我遇到了问题,删除标签的值还在文件的末尾,是否可以删除这些?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-06
    • 1970-01-01
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多