我必须将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>
但这并不考虑缺少的属性。 有没有人有想法如何解决这个问题?
答案 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属性的示例