2013-05-06 11 views
0

Я пытаюсь проверить, существует ли элемент. Если это не так, я хотел бы добавить значение по умолчанию. Вот мой XML:после преобразования, xslt, чтобы добавить значение по умолчанию, где элемент xml не существует

<Transaction> 
<InvoicePeriod>1</InvoicePeriod> 
<Product>Shoe</Product> 
</Transaction> 

Если InvoicePeriod элемент оленья кожа существует, по умолчанию должно быть 1:

<Transaction> 
<Product>Shoe</Product> 
</Transaction> 

Вот мой XSLT. «InvoicePeriod» предполагается превратить в «invoiceP» в универсальном формате (он работает), но, как уместить в этом, когда вы пишете код, чтобы изменить значение по умолчанию, если InvoicePeriod элемент оленья кожа существовать:

<xsl:template match="Transaction" > 
    <Transaction invoiceP="{InvoicePeriod}" > 
    <xsl:sequence select="concat($InvoicePeriod, '1'[not($InvoicePeriod)])"/> 
</xsl:template> 

Результат:

<Transaction> 
<InvoiceP>1</InvoiceP> 
<Product>Shoe</Product> 
</Transaction> 
+0

Я не ясно, что ваша проблема. Что вы подразумеваете под * «как вписаться в это, когда вы пишете код для изменения по умолчанию» *? Я бы пошел на 'xsl: if' или даже' xsl: select' над тем, что вы написали, но в любом случае работает. Какая помощь вам нужна? – Borodin

+0

Извините, что вы не поняли. Да, я попробовал xsl: выбрать и xsl: когда.Посмотрите здесь: \t \t \t \t \t \t \t \t \t \t \t \t 1 \t \t \t \t \t он не работает, когда элемент xml не существует, который изменяется на значение по умолчанию '1' – user1358072

+0

Ваш xsl: когда кажется, что все в порядке. Только InvoicePeriod - это имя узла, а не атрибут в вашем примере. Therfor удаляет все '@' перед InvoicePeriod, и он должен это делать. ' \t \t \t \t \t \t \t \t \t \t \t ' –

ответ

0

попробовать что-то вроде этого:

<?xml version="1.0"?> 
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:strip-space elements="*"/> 
    <xsl:param name="def_InvoicePeriod" select="'1'" /> 

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

    <xsl:template match="Transaction[not(InvoicePeriod)]" > 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
      <invoiceP> 
       <xsl:value-of select="$def_InvoicePeriod"/> 
      </invoiceP> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

def_InvoicePeriod может быть изменен во время вызова вашей трансформации. Например Wiht xslptorc:

xsltproc --stringparam def_InvoicePeriod 2 xsltfile xmlfile 

Update: (кажется invoiceP должен быть атрибутом в транзакции и значение по умолчанию должно быть использование также пустое значение или значение = «0»

Попробуйте это:.

<?xml version="1.0"?> 
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:strip-space elements="*"/> 
    <xsl:param name="def_InvoicePeriod" select="'1'" /> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="InvoicePeriod" /> 
    <xsl:template match="Transaction" > 
     <xsl:copy> 
      <xsl:attribute name="invoiceP"> 
       <xsl:choose> 
        <xsl:when test="number(InvoicePeriod) &gt; '0' "> 
         <xsl:value-of select="InvoicePeriod"/> 
        </xsl:when> 
        <xsl:otherwise> 
         <xsl:value-of select="$def_InvoicePeriod"/> 
        </xsl:otherwise> 
       </xsl:choose> 
      </xsl:attribute> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

Обновление входного теста:

<?xml version="1.0"?> 
<xml> 
    <Transaction> 
     <InvoicePeriod>1</InvoicePeriod> 
     <Product>Shoe</Product> 
    </Transaction> 
    <Transaction> 
     <InvoicePeriod>3</InvoicePeriod> 
     <Product>Shoe1</Product> 
    </Transaction> 
    <Transaction> 
     <InvoicePeriod>0</InvoicePeriod> 
     <Product>Shoe2</Product> 
    </Transaction> 
    <Transaction> 
     <Product>Shoe3</Product> 
    </Transaction> 
</xml> 

Выход:

<?xml version="1.0"?> 
<xnl> 
    <Transaction invoiceP="1"> 
    <Product>Shoe</Product> 
    </Transaction> 
    <Transaction invoiceP="3"> 
    <Product>Shoe1</Product> 
    </Transaction> 
    <Transaction invoiceP="1"> 
    <Product>Shoe2</Product> 
    </Transaction> 
    <Transaction invoiceP="1"> 
    <Product>Shoe3</Product> 
    </Transaction> 
</xnl> 
0

Кажется, что вы ищете что-то вроде:

<xsl:template match="Transaction"> 
    <Transaction> 
     <xsl:if test="not(InvoicePeriod)"> 
     <InvoiceP>1</InvoiceP> 
     </xsl:if> 
     <xsl:apply-templates/> 
    </Transaction> 
    </xsl:template> 
0

Проблема с кодом (который вы показали в комментарии) является то, что вы смотрите на @InvoicePeriod, которые является атрибутом из Transaction, который не появляется. Вам нужно просто указать InvoicePeriod, который является дочерним элементом этого имени.

Если вам действительно нужен Период счета как атрибут InvoiceP, тогда вам нужно что-то вроде этого. Я также скопировал элемент Product, так как я не знал, что еще с ним делать.

<xsl:template match="Transaction"> 
    <xsl:copy> 
     <xsl:attribute name="InvoiceP"> 
      <xsl:choose> 
       <xsl:when test="InvoicePeriod and InvoicePeriod > 0"> 
        <xsl:value-of select="InvoicePeriod"/> 
       </xsl:when> 
       <xsl:otherwise>1</xsl:otherwise> 
      </xsl:choose> 
     </xsl:attribute> 
     <xsl:copy-of select="Product"/> 
    </xsl:copy> 
</xsl:template> 

выход

<Transaction InvoiceP="1"> 
    <Product>Shoe</Product> 
</Transaction>