变换后,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>
答
尝试这样:
<?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) > '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>
我不清楚你的问题是什么。你是什么意思?“当你编写代码来改变默认值时,如何适应这个问题?”?我会选择'xsl:if'或者甚至是'xsl:choose'来代替你写的东西,但是这两种方法都有效。你需要什么帮助? – Borodin 2013-05-06 12:54:32
对不起,没有说清楚。是的,我试过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
您的xsl:当似乎是好的。在您的示例中,仅InvoicePeriod是节点名称而不是属性。 Thervo在InvoicePeriod之前删除所有'@',它应该这样做。 '的 \t \t \t \t \t \t的 \t \t \t \t \t' –
2013-05-06 13:24:57