2015-03-25 2 views
0

Я пытаюсь создать xslt, который либо копирует все из исходного xml в цель, либо создает пустой файл на основе определенного значения в исходном файле.xslt Условная трансформация

Пусть у меня есть source1.xml, как следующее:

<Order> 
    <isDigitalProduct>true</isDigitalProduct> 
    <productID>1234</productID> 
<Order> 

и source2.xml, как в следующем:

<Order> 
    <isDigitalProduct>false</isDigitalProduct> 
    <productID>5678</productID> 
<Order> 

Как я могу изменить мой XSLT оценить значение <isDigitalProduct> так что, когда его значение «истинно», скопируйте все как есть и создайте пустой вывод, когда его значение «ложно»? В приведенном выше примере source1.xml будет копировать содержимое, тогда как source2.xml после преобразования создаст пустой файл.

Любая помощь приветствуется!

Еще один вопрос, что, если вместо копирования все, что мне нужно, чтобы преобразовать элемент <isDigitalProduct> в <SerialNumber>. Например, с source2.xml еще превращается в пустой выход в то время как source1.xml быть преобразована в:

<Order> 
    <SerialNumber>ABC</SerialNumber> 
    <productID>1234</productID> 
<Order> 

Thanx!

+0

Вы можете также Опубликовать XSL-T, который вы уже пробовали? – potame

+0

Повторный вопрос: откуда взялось значение «ABC»? –

+0

О, «ABC» будет просто фиксированным случайным значением, поэтому можно с уверенностью предположить это твердое значение. –

ответ

0

Как я могу изменить мой XSLT оценить значение <isDigitalProduct>, так что, когда его значение равно «true», скопируйте все как есть, и произведите пустой вывод, когда его значение «false»?

Если это все вы хотите сделать, вы могли бы сделать просто:

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


<xsl:template match="/"> 
    <xsl:copy-of select="Order[isDigitalProduct='true']"/> 
</xsl:template> 

</xsl:stylesheet> 

Еще один вопрос, что, если вместо того, чтобы скопировать все, что нужно превратить <isDigitalProduct> элемент в <SerialNumber>.

В таком случае, вместо того, чтобы копировать соблюдения Orderкак, вы бы применить шаблон к нему - и в этом шаблоне сделать любые необходимые изменения, например:

<xsl:template match="/"> 
    <xsl:apply-templates select="Order[isDigitalProduct='true']"/> 
</xsl:template> 

<xsl:template match="Order"> 
    <xsl:copy> 
     <SerialNumber>ABC</SerialNumber> 
     <xsl:copy-of select="productID"/> 
    </xsl:copy> 
</xsl:template> 
0

Нечто подобное должно работать, но вы, скорее всего, чтобы получить некоторые ошибки, если в результате дерево пусто ...

<xsl:template match="Order"> 
    <xsl:choose> 
    <xsl:when test="isDigitalProduct/text() = 'true'"> 
     <xsl:copy-of select="."/> 
    </xsl:when> 
    <xsl:otherwise> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 
Смежные вопросы