使用id更新另一个xml

时间:2014-02-17 09:49:27

标签: xslt xslt-2.0

我必须从translation.xml中选择文字并更新skeleton.xml各自(@xid = @id个)节点。换句话说,如果@id的{​​{1}}与translation.xml的{​​{1}}匹配,则文字内容应放在@xid下(如果有子元素,则为+文本内容(内联元素skeleton.xmlskeleton.xml等)也应该放在相应的父元素中:有关详细信息,请参阅下面的示例:

注意:内联元素可以是skeleton.xml中的任何内容(它不限于b或i,因此它应该是通用的)

skeleton.xml

i

translation.xml

b

UpdatedSkeleton.xml

    <root>
        <para a="b" b="c">
            <text xid="1">This is first para <b xid="2" a="c" b="d">This is bold <i xid="3" b="d" c="e">This is italics</i> rest of bold</b> rest of para</text>
        </para>
        <para><text xid="4">This is second para</text></para>
        <para><text xid="5">This is unchanged para</text></para>
        <para><text xid="6">This is unchanged para</text></para>
    </root>

我正在尝试使用此代码,但面临的挑战是将内联内容的文本放在正确的位置:

    <root>
        <TU id="1">
            <source>This is first para <g id="2" tagName="b">This is bold <g id="3" tagName="i">This is italics</g> rest of bold</g> rest of para</source>
            <target>suum primum para <g id="2" tagName="b">Et hoc confidens, <g id="3" tagName="i">Hoc est, Te Deum</g> Reliqua autem audet,</g> reliqua autem verba haec</target>
        </TU>
        <TU id="4">
            <source>This is second para</source>
            <target>Hoc est secundum verba haec</target>
        </TU>
    </root>

1 个答案:

答案 0 :(得分:0)

您可以将<text>节点添加<xsl:copy>到您的测试版块,然后使用xid复制<xsl:attribute>属性。对于未修改的节点,您可以使用<xsl:copy-of>复制整个树,包括属性:

<xsl:when test="$doc//*[$skelID=@id]">
    <xsl:copy>
        <xsl:attribute name="xid">
            <xsl:value-of select="$skelID"/>
        </xsl:attribute>
        <xsl:apply-templates select="$doc//*[$skelID=@id]/target"/>
    </xsl:copy>
</xsl:when>
<xsl:otherwise>
    <xsl:copy-of select="."/>
</xsl:otherwise>

这也将复制<target>元素。您可以删除它添加模板:

<xsl:template match="target">
    <xsl:apply-templates/>
</xsl:template>

您也没有替换<g>标记。我假设@tagName属性说明它应该转化为什么。这应该这样做:

<xsl:template match="g">
    <xsl:element name="{@tagName}">
         <xsl:attribute name="xid">
              <xsl:value-of select="@id"/>
         </xsl:attribute>
         <xsl:apply-templates/>
    </xsl:element>
</xsl:template>

我可能错过了一些东西,但这可能会解决你的大多数问题。