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

时间:2013-05-06 12:10:00

标签: 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>

3 个答案:

答案 0 :(得分: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应该是Transaction中的一个属性,默认值也应该用于空值或value =“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>

答案 1 :(得分:0)

看起来你看起来像是:

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

答案 2 :(得分: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>