我正在努力测试是否存在元素。如果没有,我想添加一个默认值。这是我的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 :(得分: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) > '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>