Xalan重定向:写入,使用两个元素值中的任何一个来创建新的.xml文件的名称,具体取决于空值

时间:2010-05-26 20:13:24

标签: java xslt nullpointerexception xalan

所以我有以下代码:

<redirect:write select="concat('..\\folder\\,string(filename),'.xml')">

其中“ filename ”是xml源代码中的标记。当filename为null或空白时,会出现问题。这是几个xml文件名标签的情况。所以我想要实现的是一种检查方法。这就是我所做的:

<xsl-if test = "filename != ''">
        <xsl:variable name = "tempName"  select = "filename" />
        </xsl-if>
        <xsl-if test ="filename = ''">
        <xsl:variable name = "tempName" select = "filenameB"/>
        </xsl-if>

<redirect:write select="concat('..\\folder\\,string($tempName),'.xml')">

我编译Java代码时似乎得到 NPEs ,说变量无法解析:tempName

1 个答案:

答案 0 :(得分:2)

此转化

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:redirect="my:redirect"
 >
 <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="filename">
   <xsl:variable name="tempName">
     <xsl:choose>
      <xsl:when test="text()">
        <xsl:value-of select="."/>
      </xsl:when>
      <xsl:otherwise>filenameB</xsl:otherwise>
     </xsl:choose>
   </xsl:variable>

   <redirect:write select="..\\folder\\{$tempName}.xml"/>
 </xsl:template>
</xsl:stylesheet>

应用于此XML文档

<t xmlns:redirect="my:redirect">
  <filename>Z</filename>
  <filename/>
</t>

生成想要的正确结果

   <t xmlns:redirect="my:redirect">
    <redirect:write select="..\\folder\\Z.xml" />
    <redirect:write select="..\\folder\\filenameB.xml" />
   </t>

请注意:每当根据条件建立变量的值时,就会在变量体内使用<xsl:choose>来实现此条件。