在XSLT 1.0中,我尝试做以下工作:
将所有的Fram元素按原样复制到输出中,其中条件是Fram的任何属性(@name和@type AND @ref)的值与任何XFram元素匹配,则它应该使用XFram/text()更新Fram/text()。在复制XFram元素其余部分(所有这些元素都符合上面的标准)并将它们转换为Fram标记之后。
注意:第三个Fram元素的all属性与第三个Xfram元素匹配,因此文本被附加到第三个Fram元素中。XFarm元素的其余部分被转换为框架元素,并添加到最后一个框架元素之后。你也会注意到Fram的顺序没有改变。
Input.XML
<Doc>AL
<Frams>
<Fram type="x" name="Fram1" ref="ref1">This is Fram One</Fram>
<Fram type="y" name="Fram2" ref="ref2">This is Fram Two</Fram>
<Fram type="z" name="Fram3" ref="ref3">This is Fram Three</Fram>
<Fram type="a" name="Fram4" ref="ref3">This is Fram Four</Fram>
<Fram type="b" name="Fram5" ref="ref3">This is Fram Five</Fram>
</Frams>
<XFram>
<XFram type="e" name="XFram1" ref="Xref1">This is XFram One</Fram>
<XFram type="f" name="XFram2" ref="Xref2">This is XFram Two</Fram>
<XFram type="z" name="XFram3" ref="Xref3">This is XFram Three</Fram>
<XFram type="e" name="XFram1" ref="Xref1">This is XFram Four</Fram>
<XFram>
<Doc>输出应为:
<Doc>
<Frams>
<Fram type="x" name="Fram1" ref="ref1">This is Fram One</Fram>
<Fram type="y" name="Fram2" ref="ref2">This is Fram Two</Fram>
<Fram type="z" name="Fram3" ref="ref3">This is XFram Three</Fram>
<Fram type="a" name="Fram4" ref="ref3">This is Fram Four</Fram>
<Fram type="b" name="Fram5" ref="ref3">This is Fram Five</Fram>
<XFram type="e" name="XFram1" ref="Xref1">This is XFram One</Fram>
<XFram type="f" name="XFram2" ref="Xref2">This is XFram Two</Fram>
<XFram type="e" name="XFram1" ref="Xref1">This is XFram Four</Fram>
</Frams>
<Doc>我正在做这样的事情,但不能思考其中的逻辑:
<xsl:template match="/">
<xsl:for-each select="XFram">
<xsl:variable name="type">
<xsl:value-of select="type"/>
</xsl:variable>
<xsl:variable name="name">
<xsl:value-of select="name"/>
</xsl:variable>
<xsl:variable name="ref">
<xsl:value-of select="ref"/>
</xsl:variable>
<xsl:for-each select="//Fram">
<xsl:choose>
<xsl:when test="(type = $type) and (name = $name) and (ref = $ref)"> </xsl:when>
</xsl:choose>
</xsl:for-each>
</xsl:for-each>
</xsl:template>发布于 2012-04-21 10:41:47
此转换
<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="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Fram[last()]">
<xsl:call-template name="identity"/>
<xsl:apply-templates
select="../../XFram/*"/>
</xsl:template>
<xsl:template match="XFram/XFram">
<xsl:if test=
"not(/*/Frams/*
[@type = current()/@type
and
concat('X',@name) = current()/@name
and
concat('X',@ref) = current()/@ref
]
)">
<xsl:copy-of select="."/>
</xsl:if>
</xsl:template>
<xsl:template match="XFram"/>
</xsl:stylesheet>在提供的XML文档上应用时(已更正严重畸形!):
<Doc>
<Frams>
<Fram type="x" name="Fram1" ref="ref1">This is Fram One</Fram>
<Fram type="y" name="Fram2" ref="ref2">This is Fram Two</Fram>
<Fram type="z" name="Fram3" ref="ref3">This is Fram Three</Fram>
<Fram type="a" name="Fram4" ref="ref3">This is Fram Four</Fram>
<Fram type="b" name="Fram5" ref="ref3">This is Fram Five</Fram>
</Frams>
<XFram>
<XFram type="e" name="XFram1" ref="Xref1">This is XFram One</XFram>
<XFram type="f" name="XFram2" ref="Xref2">This is XFram Two</XFram>
<XFram type="z" name="XFram3" ref="Xref3">This is XFram Three</XFram>
<XFram type="e" name="XFram1" ref="Xref1">This is XFram Four</XFram></XFram>
</Doc>会生成想要的正确结果:
<Doc>
<Frams>
<Fram type="x" name="Fram1" ref="ref1">This is Fram One</Fram>
<Fram type="y" name="Fram2" ref="ref2">This is Fram Two</Fram>
<Fram type="z" name="Fram3" ref="ref3">This is Fram Three</Fram>
<Fram type="a" name="Fram4" ref="ref3">This is Fram Four</Fram>
<Fram type="b" name="Fram5" ref="ref3">This is Fram Five</Fram>
<XFram type="e" name="XFram1" ref="Xref1">This is XFram One</XFram>
<XFram type="f" name="XFram2" ref="Xref2">This is XFram Two</XFram>
<XFram type="e" name="XFram1" ref="Xref1">This is XFram Four</XFram>
</Frams>
</Doc>https://stackoverflow.com/questions/10254005
复制相似问题