为XSLT1.0中的每个空XML标记设置默认值

为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,所以有没有办法让它像一个标识模板一样,总是从我的输入中读取它,然

我需要使用XSLT1.0将一个默认文本或数字写入一个空XML标记,然后在StackOverflow中搜索这里,我碰巧看到了本文中Dimitre的解决方案

例如,我需要一个标签,如下所示:

<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的精神,建议并首选使用许多简短的模板,而不是使用少数、大型、复杂、不可读和难以维护的模板。事实上,在任何语言中,使用条件语句都是反模式的。如图所示: