2016-08-09 4 views
0

У меня есть xml-файл, который генерируется процессом. У этого xml может быть много продуктов и предметов под каждым продуктом. Однако есть сценарии, когда у продукта нет товаров под ним, как показано в примере ниже. В этой ситуации я хочу, чтобы xml не генерировал продукты, в которых нет элемента. Мне нужен скрипт xsl, который должен это сделать. Кто-нибудь может помочь? Входной файл XML являетсяБлокировать элементы XML, если нижний элемент отсутствует или пустой

<?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. Вывод должен быть

<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> 

код, я использую, чтобы достичь на основании предложений здесь

<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 приходит на выходе

<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> 
+0

Недействительны ваши XML-документы. Пожалуйста, исправьте их и отправьте код XSLT, который вы пробовали. –

ответ

0

Каждый раз, когда вы хотите, чтобы преобразовать документ и только внести некоторые изменения начинаются с templat тождественного преобразования e

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

, а затем вы добавляете шаблоны для тех элементов, которые хотите преобразовать. Если вы хотите удалить элемент, то вы добавить пустой шаблон, соответствующий этот элемент, как вы хотите, чтобы удалить все product элементов, не имеющими item элементов, которые вы используете

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

Так все, что вам нужно, это

<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> 

который преобразует входной сигнал скорректированного

<?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 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> 

online at http://xsltransform.net/bFWR5DD.

+0

... исходя из вашего предложения, я могу продвинуться в некоторой степени, но я получаю код xsl в выходе. Я обновил свой код в конце своего сообщения – adit

+0

Я боюсь, что ваш образец, например. ' P16754' не XML вообще, так что это трудно помочь. Вам нужно будет опубликовать хорошо сформированный XML-документ для начала, тогда мы сможем помочь в написании XSLT. –

+0

@adit, см. Редактирование ответа, у него есть полный рабочий образец. Мне нужно было исправить ваш образец ввода, поскольку он не является хорошо сформированным XML. –

Смежные вопросы