【发布时间】: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值。