使用xslt在特定点创建XML元素

时间:2017-09-12 23:49:43

标签: xml xslt

我使用XSLT转换我从网络服务接收的XML。我得到的是这样的:

<benefit>
   <statusReasonCode1>Code</statusReasonCode1>
   <statusReason1>Reason</statusReason1>
   <otherStuff1>blah</otherStuff1>
   <otherStuff2>blah</otherStuff2>
</benefit>

我想要的是:

<benefit>
   <statusReasonCode1>Code</statusReasonCode1>
   <statusReason1>Reason</statusReason1>
   <statusReasonText1>Code - Reason></statusReasonText1>
   <otherStuff1>blah</otherStuff1>
   <otherStuff2>blah</otherStuff2>
</benefit>

我得到的是:

<benefit>
   <statusReasonCode1>Code</statusReasonCode1>
   <statusReason1>Reason</statusReason1>
   <otherStuff1>blah</otherStuff1>
   <otherStuff2>blah</otherStuff2>
   <statusReasonText1>Code - Reason></statusReasonText1>
</benefit>

这是xslt正在做的事情:

<xsl:template match=''benefit''>
    <xsl:copy use-attribute-sets=''newBenefit''>
        <xsl:apply-templates/>
        <statusReasonCodeText1><xsl:value-of select="statusReasonCode1"/><xsl:text> - </xsl:text><xsl:value-of select="statusReason1"/></statusReasonCodeText1> 
    </xsl:copy>  
</xsl:template>

有没有办法在创建元素时指定位置?

2 个答案:

答案 0 :(得分:1)

如果必须在statusReason1之后插入新元素,那么你可以这样做:

<xsl:template match="statusReason1">
  <xsl:copy-of select="."/>
  <statusReasonCodeText1><xsl:value-of select="../statusReasonCode1"/><xsl:text> - </xsl:text><xsl:value-of select="."/></statusReasonCodeText1>
</xsl:template>

答案 1 :(得分:0)

你可以这样做:

<xsl:template match="benefit">
    <xsl:copy>
        <xsl:apply-templates select="statusReasonCode1 | statusReason1"/>
        <statusReasonCodeText1>
            <xsl:value-of select="statusReasonCode1"/>
            <xsl:text> - </xsl:text>
            <xsl:value-of select="statusReason1"/>
        </statusReasonCodeText1>
        <xsl:apply-templates select="otherStuff1 | otherStuff2"/>
    </xsl:copy>
</xsl:template>

根据您对输入的了解以及您正在使用的XSLT版本,还有其他方法。

加了:

  

在现实生活中,其他领域是众多且充满活力的,所以我不能真正按名称添加它们

您可以使用以下方式添加它们:

<xsl:apply-templates select="*[not(self::statusReasonCode1 or self::statusReason1)]"/>

或:

<xsl:apply-templates select="*[not(starts-with(name(), 'statusReason'))]"/>