变换后,xslt添加默认值,其中xml元素不存在

问题描述:

我努力测试,看看是否存在一个元素。如果没有,我想添加一个默认值。这里是我的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 XSL:否则> \t \t \t \t \t XSL:属性> 当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

尝试这样:

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

看来你正在寻找类似:

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

与您的代码(即您的评论显示)的问题是,你看@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>