2013-05-06 26 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:choose'來代替你寫的東西,但是這兩種方法都有效。你需要什麼幫助? – Borodin 2013-05-06 12:54:32

+0

對不起,沒有說清楚。是的,我試過xsl:選擇和xsl:時。看看這裏:\t的 \t \t \t \t \t的 \t \t \t的 \t \t \t的 1 \t \t \t \t \t 當xml元素不存在時,它不工作,更改爲默認'1' – user1358072 2013-05-06 12:59:40

+0

您的xsl:當似乎是好的。在您的示例中,僅InvoicePeriod是節點名稱而不是屬性。 Thervo在InvoicePeriod之前刪除所有'@',它應該這樣做。 '的 \t \t \t \t \t \t的 \t \t \t \t \t' – 2013-05-06 13:24:57

回答

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可以同時調用你的轉換來改變。 例如室內用xslptorc:

xsltproc --stringparam def_InvoicePeriod 2 xsltfile xmlfile 

更新:(看來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>