2015-04-15 5 views
0

Мне нужно проверить, имеет ли элемент заказа атрибут узла, который имеет дочернее имя «имя» с текстом SERIAL и дочерним узлом «значение», которое является пустым.XSLT: Как проверить, имеет ли дочерний узел определенный элемент имени и пустой элемент значения?

Образец ввода № 1: Нет Серийное число.

<orders> 
     <order> 
      <attributes> 
      <attribute> 
       <name>SERIAL</name> 
       <value></value> 
      </attribute> 
      <attribute> 
       <name>BATCH</name> 
       <value>Batch1</value> 
      </attribute> 
      </attributes> 
     </order> 
    </orders> 

Выход для # 1: Нет серийный номер

<externalorder> 
    <batchnumbers> 
    <batch>Batch1</batch> 
    <batchnumbers> 
</externalorder> 

Пример ввода # 2: С серийным номером, но без номера партии

<orders> 
     <order> 
      <attributes> 
      <attribute> 
       <name>SERIAL</name> 
       <value>1</value> 
      </attribute> 
      <attribute> 
       <name>SERIAL</name> 
       <value>2</value> 
      </attribute> 
      <attribute> 
       <name>BATCH</name> 
       <value></value> 
      </attribute> 
      </attributes> 
     </order> 
    </orders> 

выход для # 2

<externalorder> 
    <serialnumbers> 
    <serialnumber>1</serialnumber> 
    <serialnumber>2</serialnumber> 
    <serialnumbers> 
</externalorder> 
+4

Пожалуйста расширить свой вопрос, чтобы включить контекст (который является «я» в «У меня есть атрибут») и цель (то, что вы хотите делать, если в противном случае /). Здесь также может быть важна версия, использующая -XSLT 1.0 или 2.0. –

+0

Теперь ясно? – Lance

+0

Едва ли; эти два варианта не являются взаимоисключающими и исчерпывающими. Во всяком случае, не отвечает ли ответ Дэном Фил? –

ответ

1

Это по-прежнему та же самая основная проблема: вам нужны два шаблона, один из которых соответствует attribute[name='BATCH' and value!=''], а один соответствует attribute[name='SERIAL' and value!='']. Я оставлю это вам, чтобы выяснить, как подавить пустой узел, если вам действительно нужно это сделать.

Обновлено для нового ввода/вывода:

<?xml version="1.0" encoding="utf-8" ?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="/orders/order"> 
    <externalorder> 
     <serialnumbers> 
      <xsl:apply-templates select="attributes/attribute[name='SERIAL' and value!='']" /> 
     </serialnumbers> 
     <batchnumbers> 
      <xsl:apply-templates select="attributes/attribute[name='BATCH' and value!='']" /> 
     </batchnumbers> 

    </externalorder> 
    </xsl:template> 

    <xsl:template match="attribute[name='SERIAL']"> 
    <serialnumber> 
     <xsl:value-of select="value" /> 
    </serialnumber> 
    </xsl:template> 


    <xsl:template match="attribute[name='BATCH']"> 
    <batch> 
     <xsl:value-of select="value" /> 
    </batch> 
    </xsl:template> 

</xsl:stylesheet> 
+0

Вам не нужно указывать один и тот же предикат дважды. –

+1

Как мне заставить его вызывать правильный шаблон? Если я возьму предикат с того или другого, оба шаблона в конечном итоге будут вызваны, если я просто не понимаю вас. –

+0

Хорошо, это сработало. Мне просто нужно добавить xsl: если для него не отображать batchnumbers/serialnumbers, если нет никакой ценности. Спасибо, Дэн! – Lance

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