基于另一个元素插入新元素

时间:2017-10-11 12:11:08

标签: xml xslt xpath-2.0

我有一个像这样的输入xml文件

<document startnum="1" language="en-US">
<meta>
<categories>
<category medicalbranch="surgery">
</category>
</categories>
<doctitle>Traumatology for the Physical Therapist</doctitle>
<relatedobjects>
<relpdfio/>
</relatedobjects>
<publisher>
<publishername>Georg Thieme Verlag</publishername>
<copyright>Georg Thieme Verlag</copyright>
</publisher>
</meta>

输出xml应如下所示

<document startnum="1" language="en-US">
<meta>
<categories>
<category medicalbranch="surgery">
</category>
</categories>
<isbn type="print"> </isbn>
<isbn type="online"> </isbn>
<materialid/>
<metadata type="searchlevel"/>
<doctitle>Traumatology for the Physical Therapist</doctitle>
<relatedobjects>
<relpdfio/>
</relatedobjects>
<publisher>
<publishername>Georg Thieme Verlag</publishername>
<copyright>Georg Thieme Verlag</copyright>
</publisher>
</meta>

每当“meta”元素在源代码中不包含“isbn”时,我需要插入上面提到的4个元素。

我写了如下xslt:

<xsl:template match="meta">
    <xsl:if test="node[not(isbn)]">
        <xsl:element name="isbn">
            <xsl:attribute name="type">print</xsl:attribute> 
            <xsl:text>&#xA0;</xsl:text>
        </xsl:element><xsl:text>&#xa;</xsl:text>
        <xsl:element name="isbn">
            <xsl:attribute name="type">online</xsl:attribute>
            <xsl:text>&#xA0;</xsl:text>
        </xsl:element>
        <xsl:text>&#xa;</xsl:text>        
        <xsl:element name="materialid"></xsl:element><xsl:text>&#xa;</xsl:text>
        <xsl:element name="metadata">
            <xsl:attribute name="type">searchlevel</xsl:attribute></xsl:element>
        <xsl:text>&#xa;</xsl:text>
        <!--<xsl:text disable-output-escaping="yes">-\-&gt;</xsl:text>-->
        <xsl:apply-templates select="@*|node()"/>
        <xsl:text>&#xa;</xsl:text>
    </xsl:if>
    <xsl:copy>
        <xsl:apply-templates select="node() | @*"/> 
    </xsl:copy>
</xsl:template>

您能否帮我们解决此问题。

1 个答案:

答案 0 :(得分:0)

从身份转换模板

开始
<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>

然后决定要插入新元素的位置,例如在categories元素之后,例如

<xsl:template match="meta[not(isbn)]/categories">
  <xsl:next-match/><!-- copies the categories element with the identity transformation template -->
  <isbn type="print"> </isbn>
  <isbn type="online"> </isbn>
  <materialid/>
  <metadata type="searchlevel"/>
</xsl:template>