首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果项下面缺少或空白,则阻止XML元素。

如果项下面缺少或空白,则阻止XML元素。
EN

Stack Overflow用户
提问于 2016-08-09 08:36:34
回答 1查看 57关注 0票数 0

我有一个由进程生成的xml文件。这个xml可能在每个产品下有许多产品和项目。但是,在某些情况下,产品下不能有项目,如下面的示例所示。在这种情况下,我希望xml不要在没有项目的地方生成产品。我希望xsl脚本能够做到这一点。有人能帮忙吗?输入的xml文件是

代码语言:javascript
复制
    <?xml version="1.0" encoding="UTF-8"?>
    <products>
        <product>
            <prod id>P16754</prod id>
            <product-status>CREATED</product-status>
            <validation-status>Valid</validation-status>
            <duplication-status>Unique</duplication-status>
            <content-status>New</content-status>
    <items/>

            <created-on>2016-08-12T11:30:00</created-on>
            <created-by>Administrator</created-by>
            <last-changed-on>2016-08-04T17:34:00</last-changed-on>
            <last-changed-by>ap0712</last-changed-by>
            <delete>false</delete>
        </product>
    <product>

        <prod id>P16754</prod id>
        <product-status>CREATED</product-status>
        <validation-status>Valid</validation-status>
        <duplication-status>Unique</duplication-status>
        <content-status>New</content-status>
<items>
     <item>
            <item id>i16754</item id>
            <item-status>CREATED</item-status>
            <validation-status>Valid</validation-status>
            <duplication-status>Unique</duplication-status>
            <content-status>New</content-status>
    </item>
<items/>

        <created-on>2016-08-12T11:30:00</created-on>
        <created-by>Administrator</created-by>
        <last-changed-on>2016-08-04T17:34:00</last-changed-on>
        <last-changed-by>ap0712</last-changed-by>
        <delete>false</delete>
    </product>
</products>

因为第一个产品没有项,所以这个产品以及项应该从输出xml中删除。输出应该是

代码语言:javascript
复制
<products>
    <product>
        <prod id>P16754</prod id>
        <product-status>CREATED</product-status>
        <validation-status>Valid</validation-status>
        <duplication-status>Unique</duplication-status>
        <content-status>New</content-status>
<items>
     <item>
            <item id>i16754</item id>
            <item-status>CREATED</item-status>
            <validation-status>Valid</validation-status>
            <duplication-status>Unique</duplication-status>
            <content-status>New</content-status>
    </item>
<items/>

        <created-on>2016-08-12T11:30:00</created-on>
        <created-by>Administrator</created-by>
        <last-changed-on>2016-08-04T17:34:00</last-changed-on>
        <last-changed-by>ap0712</last-changed-by>
        <delete>false</delete>
    </product>
</products>

下面是我根据建议使用的代码

代码语言:javascript
复制
<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

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

 <xsl:template match="Prod ID[not(items/item)]"/> 

</xsl:stylesheet>

如果产品和项为空,它将删除该产品和项,但在输出中得到以下内容,例如,输出中有xslt代码

代码语言:javascript
复制
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output omit-xml-declaration="yes" indent="yes"/>
        <xsl:strip-space elements="*"/>
        <xsl:template match="node()|@*">
            <xsl:copy>
                <xsl:apply-templates select="node()|@*"/>
            </xsl:copy>
        </xsl:template>
        <xsl:template match="Prod ID[not(items/item)]"/>
    </xsl:stylesheet>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-09 09:30:52

每当您想要转换文档并且只进行一些更改时,您都可以从标识转换模板开始。

代码语言:javascript
复制
<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>

然后为要转换的元素添加模板。如果要删除元素,则添加一个与该元素匹配的空模板,因为您希望删除所有没有使用product元素的item元素。

代码语言:javascript
复制
<xsl:template match="product[not(items/item)]"/>

所以你所需要的就是

代码语言:javascript
复制
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

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

    <xsl:template match="product[not(items/item)]"/>

</xsl:transform>

,它转换校正的输入。

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<products>
    <product>
        <prod-id>P16754</prod-id>
        <product-status>CREATED</product-status>
        <validation-status>Valid</validation-status>
        <duplication-status>Unique</duplication-status>
        <content-status>New</content-status>
        <items/>

        <created-on>2016-08-12T11:30:00</created-on>
        <created-by>Administrator</created-by>
        <last-changed-on>2016-08-04T17:34:00</last-changed-on>
        <last-changed-by>ap0712</last-changed-by>
        <delete>false</delete>
    </product>
    <product>

        <prod-id>P16754</prod-id>
        <product-status>CREATED</product-status>
        <validation-status>Valid</validation-status>
        <duplication-status>Unique</duplication-status>
        <content-status>New</content-status>
        <items>
            <item>
                <item-id>i16754</item-id>
                <item-status>CREATED</item-status>
                <validation-status>Valid</validation-status>
                <duplication-status>Unique</duplication-status>
                <content-status>New</content-status>
            </item>
        </items>

        <created-on>2016-08-12T11:30:00</created-on>
        <created-by>Administrator</created-by>
        <last-changed-on>2016-08-04T17:34:00</last-changed-on>
        <last-changed-by>ap0712</last-changed-by>
        <delete>false</delete>
    </product>
</products>

输入输出

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?><products>

    <product>

        <prod-id>P16754</prod-id>
        <product-status>CREATED</product-status>
        <validation-status>Valid</validation-status>
        <duplication-status>Unique</duplication-status>
        <content-status>New</content-status>
        <items>
            <item>
                <item-id>i16754</item-id>
                <item-status>CREATED</item-status>
                <validation-status>Valid</validation-status>
                <duplication-status>Unique</duplication-status>
                <content-status>New</content-status>
            </item>
        </items>

        <created-on>2016-08-12T11:30:00</created-on>
        <created-by>Administrator</created-by>
        <last-changed-on>2016-08-04T17:34:00</last-changed-on>
        <last-changed-by>ap0712</last-changed-by>
        <delete>false</delete>
    </product>
</products>

在线在http://xsltransform.net/bFWR5DD

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38845829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档