XSLT:创建一个输出字符串,考虑到某些元素不存在

时间:2013-09-20 08:06:29

标签: sql xml xslt

我必须将xml转换为几个insert into语句。

在XML内部有一个<xpdl:ExtendedAttributes> - 元素包含最多五个<xpdl:ExtendedAttribute name="attribute1" Value="value1"> - 元素。 ouput-string必须像以下示例之一:

,'Value1','Value2','Value3','Value4','Value5');
,'','','Value3','Value4','Value5');  
etc.

问题是如果我没有在我的程序中为属性设置一个生成xml的属性值,它将不会创建<xpdl:ExtendedAttribute> - 元素。

我尝试了以下代码:

<xsl:template match="xpdl:ExtendedAttributes">
    <xsl:for-each select="xpdl:ExtendedAttribute">
        <xsl:choose>
            <xsl:when test="@Name='Value1'">
                <xsl:value-of select="concat($apos,./@Value,$apos,',')"/>
            </xsl:when>
            <xsl:when test="@Name='Value2'">
                <xsl:value-of select="concat($apos,./@Value,$apos,',')"/>
            </xsl:when>
            <xsl:when test="@Name='Value3'">
                <xsl:value-of select="concat($apos,./@Value,$apos,',')"/>
            </xsl:when>
            <xsl:when test="@Name='Value4'">
                <xsl:value-of select="concat($apos,./@Value,$apos,',')"/>
            </xsl:when>
            <xsl:when test="@Name='Value5'">
                <xsl:value-of select="concat($apos,./@Value,$apos,',')"/>
            </xsl:when>

            <xsl:otherwise>'',
            </xsl:otherwise>
        </xsl:choose>
    </xsl:for-each> 

但这并不考虑缺少的属性。 有没有人有想法如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

如果您的XML生成器没有为没有值的属性生成Extended-Attribute标记,那么就无法在XSLT中引用它们。

应该有一种方法可以告诉XSLT处理器Extended-Attribute集合中应该存在哪些属性(Extended-Attributes标记的数量)。这样,您可以使用XSLT代码在集合中查找这些属性名称,如果找不到它们,请使用默认的空撇号值。当然应该很复杂。我建议你改变你的XML生成器部分

答案 1 :(得分:0)

经过多次失败后,我终于达到了所需的输出。

使用全局序列变量

<xsl:variable name="AttributeNames" as="xs:string*" select="('Programm', 'Verantwortlich', 'Beteiligt' ,'Informiert' ,'Prozessschritt')" />

以及以下代码

<xsl:template match="xpdl:Activity/xpdl:ExtendedAttributes">
    <xsl:variable name="input" select="."/> 
        <xsl:for-each select="$AttributeNames" >
            <xsl:variable name="attributeName" select="." />
            <xsl:variable name="Value"> 
                <xsl:for-each select="$input/xpdl:ExtendedAttribute">
                    <xsl:variable name="currentNode" select="." />
                        <xsl:choose>
                             <xsl:when test="$attributeName = $currentNode/@Name">
                                  <xsl:value-of select="$currentNode/@Value" />
                             </xsl:when>
                        </xsl:choose>
                </xsl:for-each>
            </xsl:variable>
        <xsl:value-of select="concat(',', $apos,$Value, $apos,$lb)" />
        <xsl:value-of select="$input/xpdl:ExtendedAttribute[@Name=current()]" />    
    </xsl:for-each>
</xsl:template> 

我已经实现了我想要的东西:

,'' ,'Mitarbeiter' ,'' ,'' ,'16,0'  作为仅存在第2和第5属性的示例