1

我必须将一个 xml 转换为几个插入语句。

在 XML 内部有一个<xpdl:ExtendedAttributes>包含最多五个元素的元素<xpdl:ExtendedAttribute name="attribute1" Value="value1">。输出字符串必须类似于以下示例之一:

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

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

我尝试了以下代码:

<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> 

但这并没有考虑缺失的属性。有人知道如何解决这个问题吗?

4

2 回答 2

0

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

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

于 2013-09-20T09:58:57.363 回答
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 个属性

于 2013-09-23T13:04:02.097 回答