我可以将这个XSLT简化为不那么冗长的形式吗?

时间:2016-02-27 12:54:41

标签: xml xslt

我的XSLT中大多数都有这样的语句:

<RealisationRelation name='' 
                     xmi.id="{concat($serverxmiid, ':', $infraservicexmiid)}" 
                     xmi.type='I' 
                     from="{$serverxmiid}" 
                     to="{$infraservicexmiid}" />

这不是那么冗长,也不容易阅读。但是,我如何为此创建这样一个简单的语句而不是冗长的语句?

<xsl:element name="AccessRelation">
    <xsl:attribute name="name">
        <xsl:text></xsl:text>
    </xsl:attribute>
    <xsl:attribute name="xmi.id">
        <xsl:value-of select="concat( $infraservicexmiid, ':', $artifactxmiid)"/>
    </xsl:attribute>
    <xsl:attribute name="xmi.type">
        <xsl:text>I</xsl:text>
    </xsl:attribute>
    <xsl:attribute name="from">
        <xsl:value-of select="$infraservicexmiid"/>
    </xsl:attribute>
    <xsl:attribute name="to">
        <xsl:value-of select="$artifactxmiid"/>
    </xsl:attribute>

    <MM_Profile>
        <xsl:attribute name="name">
            <xsl:text>AccessRelation</xsl:text>
        </xsl:attribute>
    </MM_Profile>
    <MM_Value>
        <xsl:attribute name="name">
            <xsl:text>accessType</xsl:text>
        </xsl:attribute>
        <xsl:attribute name="value">
            <xsl:text>w</xsl:text>
        </xsl:attribute>
    </MM_Value>
</xsl:element>

我想知道如何以较不详细的形式获取这些MM_ProfileMM_Value部分。其他很容易。

2 个答案:

答案 0 :(得分:3)

使用文字结果元素,就像您已经做的那样,只需定义属性,例如: <MM_Profile name="AccessRelation"/><MM_Value name="accessType" value="w"/>。如果您需要计算(部分)属性值,则使用属性值模板进行计算,例如, <AccessRelation xmi.id="{$infraservicexmiid}:{$artifactxmiid}" from="{$infraservicexmiid}"></AccessRelation>

答案 1 :(得分:2)

以下是您的XSLT简化使用 literal result elements attribute value templates

<AccessRelation name=""
                xmi.id="{$infraservicexmiid}:{$artifactxmiid}"
                xmi.type="I"
                from="{$infraservicexmiid}"
                to="{$artifactxmiid}">
  <MM_Profile name="AccessRelation"/>
  <MM_Value name="accessType" value="w"/>
</AccessRelation>

这与你已经为RealisationRelation所做的一样(并且Martin Honnen帮助重申并命名,+1),以及文字结果元素可以嵌入到其他文字结果元素中的概念。

Creating element nodes using xsl:element很少见,但是在必须计算元素名称而不是提前知道时可能会有所帮助。