为XSLT1.0中的每个空XML标记设置默认值
我需要使用XSLT1.0将一个默认文本或数字写入一个空XML标记,然后在StackOverflow中搜索这里,我碰巧看到了本文中Dimitre的解决方案 例如,我需要一个标签,如下所示:为XSLT1.0中的每个空XML标记设置默认值,xml,xslt-1.0,Xml,Xslt 1.0,我需要使用XSLT1.0将一个默认文本或数字写入一个空XML标记,然后在StackOverflow中搜索这里,我碰巧看到了本文中Dimitre的解决方案 例如,我需要一个标签,如下所示: <Number></Number> <!--Which is empty--> 或 我需要的是为XML中的每个空标记设置一个默认值,比如数字标记的0.00,字母数字标记的nil,我有一个很大的XML,所以有没有办法让它像一个标识模板一样,总是从我的输入中读取它,然
<Number></Number> <!--Which is empty-->
或
我需要的是为XML中的每个空标记设置一个默认值,比如数字标记的0.00
,字母数字标记的nil
,我有一个很大的XML,所以有没有办法让它像一个标识模板一样,总是从我的输入中读取它,然后将其转换为在空字符串中插入默认值,或者我只能在每个字段/标记上执行下面的代码
<xsl:copy-of select="concat(categoryName,$vOther[not(string(current()/categoryName))])"/>
提前感谢。此转换:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Number[not(node())]">
<Number>0.00</Number>
</xsl:template>
<xsl:template match="Text[not(node())]">
<Text>nill</Text>
</xsl:template>
</xsl:stylesheet>
<t>
<Number>10</Number>
<Number>0.00</Number>
<Text>Hello</Text>
<Text>nill</Text>
</t>
0
尼尔
当应用于此XML文档时(因为未提供):
10
你好
生成所需的正确结果:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Number[not(node())]">
<Number>0.00</Number>
</xsl:template>
<xsl:template match="Text[not(node())]">
<Text>nill</Text>
</xsl:template>
</xsl:stylesheet>
<t>
<Number>10</Number>
<Number>0.00</Number>
<Text>Hello</Text>
<Text>nill</Text>
</t>
10
0
你好
尼尔
注意:
为了获得系统的知识来解决这样的基本问题,我(无耻地)推荐观看这个Pluralsight培训课程:
Hi@Dimitre,这是否意味着我必须为XSLT中的每个元素创建一个模板来检查它是否为空,然后用默认值替换字符串(如果为空)?如果我使用@zyberjock这样的动态元素,那么对于具有相同默认值的每组元素名称,您将需要一个模板。与任何其他编程语言一样,任何特定的东西都需要特定的代码来处理。至于你现在提出的其他要求,你可以再问一个新问题。您当前的问题已完全回答。@zyberjock,当然,您可以编写一个模板来匹配任何空元素,而不管其名称如何。但是,在这种情况下,需要有很多条件(或
),这会导致代码更复杂,可读性更低。根据XSLT的精神,建议并首选使用许多简短的模板,而不是使用少数、大型、复杂、不可读和难以维护的模板。事实上,在任何语言中,使用条件语句都是反模式的。如图所示: