基于另一个元素插入新元素
to insert new element based on another element
我有一个这样的输入 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> </xsl:text>
</xsl:element><xsl:text>
</xsl:text>
<xsl:element name="isbn">
<xsl:attribute name="type">online</xsl:attribute>
<xsl:text> </xsl:text>
</xsl:element>
<xsl:text>
</xsl:text>
<xsl:element name="materialid"></xsl:element><xsl:text>
</xsl:text>
<xsl:element name="metadata">
<xsl:attribute name="type">searchlevel</xsl:attribute></xsl:element>
<xsl:text>
</xsl:text>
<!--<xsl:text disable-output-escaping="yes">-\-></xsl:text>-->
<xsl:apply-templates select="@*|node()"/>
<xsl:text>
</xsl:text>
</xsl:if>
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
能否请您帮助我们解决这个问题。
从身份转换模板开始
<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>
我有一个这样的输入 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> </xsl:text>
</xsl:element><xsl:text>
</xsl:text>
<xsl:element name="isbn">
<xsl:attribute name="type">online</xsl:attribute>
<xsl:text> </xsl:text>
</xsl:element>
<xsl:text>
</xsl:text>
<xsl:element name="materialid"></xsl:element><xsl:text>
</xsl:text>
<xsl:element name="metadata">
<xsl:attribute name="type">searchlevel</xsl:attribute></xsl:element>
<xsl:text>
</xsl:text>
<!--<xsl:text disable-output-escaping="yes">-\-></xsl:text>-->
<xsl:apply-templates select="@*|node()"/>
<xsl:text>
</xsl:text>
</xsl:if>
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
能否请您帮助我们解决这个问题。
从身份转换模板开始
<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>