【问题标题】:Add a child element to parent Element, when the parent has some other child with certain attribute with certain value向父元素添加子元素,当父元素有其他具有特定属性和特定值的子元素时
【发布时间】:2016-12-27 15:59:02
【问题描述】:

我是 XSLT 的新手。这就是我想要做的。

我有以下源 XML。如果 EFFECT 元素(ITEM 的子元素)的 EFFRG 属性值以 RU 开头,则执行以下操作。

1) 将 EFFRG 属性替换为 EFFTEXT,其值应为“See Restricted Usage” 2) 对于 EFFRG 的每个 RU 值,如果存在,则在 PNIREF 元素之前插入以下元素。如果不存在,则在父元素末尾添加元素。

    <UOAMFR><UOA>RU320A</UOA></UOAMFR>
    <UOAMFR><UOA>RU320B</UOA></UOAMFR>

注意:我有多个 ITEM 元素标签,它们可能有也可能没有 PNRIREF 标签,并且 EFFRG 的所有属性值都不以 RU 开头。

    Source XML:

    <ITEM CHAPNBR="25" SECTNBR="13" UNITNBR="01" FIGNBR="36J" ITEMNBR="325"
    ILLUSIND="0" INDENT="3" ATTACH="0" CHG="U" KEY="ITA300-600IPCFX125130136J325"
    REVDATE="20081201">
    <EFFECT EFFRG="RU320A RU320B"/>
    <PNRMFR>
    <PNR>NAS1836-08-07M</PNR>
    <MFR>80205</MFR>
    </PNRMFR>
    <UPA>020</UPA>
    <TQA>0020</TQA>
    <ADT>INSERT</ADT>
    <PNRIREF HREF="www.example.com"/>
    </ITEM>

    Transformed XML:

    <ITEM CHAPNBR="25" SECTNBR="13" UNITNBR="01" FIGNBR="36J" ITEMNBR="325"
    ILLUSIND="0" INDENT="3" ATTACH="0" CHG="U" KEY="ITA300-600IPCFX125130136J325"
    REVDATE="20081201">
    <EFFECT EFFTEXT="See Restricted Usage"/>
    <PNRMFR>
    <PNR>NAS1836-08-07M</PNR>
    <MFR>80205</MFR>
    </PNRMFR>
    <UPA>020</UPA>
    <TQA>0020</TQA>
    <ADT>INSERT</ADT>
    <UOAMFR><UOA>RU320A</UOA></UOAMFR>
    <UOAMFR><UOA>RU320B</UOA></UOAMFR>
    <PNRIREF HREF="www.example.com"/>
    </ITEM>

到目前为止,我正在 xslt 转换中。

    <xsl:stylesheet version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output omit-xml-declaration="yes" indent="yes"/>
        <xsl:strip-space elements="*"/>

        <xsl:template match="ITEM/EFFECT/@EFFRG">
            <xsl:choose>
                <xsl:when test="starts-with(.,'RU')">
                    <xsl:attribute name="EFFTEXT">
                        <xsl:text>See Restricted Usage</xsl:text>
                    </xsl:attribute>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:attribute name="EFFRG">
                    <xsl:value-of select="." />
                    </xsl:attribute>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:template>

        <!--  Identity transform -->
        <xsl:template match="@* | node()">
            <xsl:copy>
                <xsl:apply-templates select="@* | node()"/>
            </xsl:copy>
        </xsl:template>
    </xsl:stylesheet>

【问题讨论】:

  • 你能使用像 Saxon 9、XmlPrime 或 Altova 这样的 XSLT 2.0 处理器吗?在 XSLT 2.0 中使用 tokenize 很容易分解 RU320A RU320B 值。

标签: xml xslt


【解决方案1】:

我认为您不需要 otherwise 分支,因为它会被身份转换模板覆盖,因此将测试移动到谓词模式中,然后为其他两个检查添加两个模板,并为其他两个检查添加第四个模板在 XSLT 2.0 中创建新元素会导致

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:math="http://www.w3.org/2005/xpath-functions/math"
    exclude-result-prefixes="xs math"
    version="2.0">

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

    <xsl:template match="ITEM/EFFECT/@EFFRG[starts-with(., 'RU')]">
        <xsl:attribute name="EFFTEXT">See Restricted Usage</xsl:attribute>
    </xsl:template>

    <xsl:template name="eff">
        <xsl:for-each select="tokenize(../EFFECT/@EFFRG, '\s+')">
            <UOAMFR>
                <UOA>
                    <xsl:value-of select="."/>
                </UOA>
            </UOAMFR>
        </xsl:for-each>     
    </xsl:template>

    <xsl:template match="ITEM[EFFECT/@EFFRG[starts-with(., 'RU')] and not(PNRIREF)]/*[position() = last()]">
        <xsl:copy-of select="."/>
        <xsl:call-template name="eff"/>
    </xsl:template>

    <xsl:template match="ITEM[EFFECT/@EFFRG[starts-with(., 'RU')]]/PNRIREF">
        <xsl:call-template name="eff"/>
        <xsl:copy-of select="."/>
    </xsl:template>

</xsl:stylesheet>

【讨论】:

    猜你喜欢
    • 2012-10-21
    • 2015-09-12
    • 1970-01-01
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-18
    相关资源
    最近更新 更多