Xml 通过xsl移动标记部件
有可能改变这样的东西吗Xml 通过xsl移动标记部件,xml,xslt,xpath,Xml,Xslt,Xpath,有可能改变这样的东西吗 <tag name="a"/> <something> <endtag name="a"/> <tag name="b"/> </something> <endtag name="b"/> 对此 <something> <tag name="a"/> <endtag name="a"/> <tag name="b"
<tag name="a"/>
<something>
<endtag name="a"/>
<tag name="b"/>
</something>
<endtag name="b"/>
对此
<something>
<tag name="a"/>
<endtag name="a"/>
<tag name="b"/>
<endtag name="b"/>
</something>
通过xsl转换?所以我知道
可能会或可能不会进入相应的
和
之间,这很糟糕,我必须移动它
UPD:
更多的信息。假设我们有一个输入xml,它有3种类型的标记:
、
和
。我们的目标是以一种方式对其进行转换,例如,
变成
我只需要移动前一个和后一个兄弟姐妹
考虑以下示例:
XML
<root>
<tag name="a"/>
<tag name="b"/>
<something>
<endtag name="c"/>
<tag name="d"/>
</something>
<endtag name="e"/>
<endtag name="f"/>
</root>
XSLT1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="something">
<xsl:copy>
<xsl:copy-of select="preceding-sibling::tag[1]"/>
<xsl:apply-templates/>
<xsl:copy-of select="following-sibling::endtag[1]"/>
</xsl:copy>
</xsl:template>
<xsl:template match="tag[following-sibling::*[1][self::something]] | endtag[preceding-sibling::*[1][self::something]]"/>
</xsl:stylesheet>
结果
<?xml version="1.0" encoding="UTF-8"?>
<root>
<tag name="a"/>
<something>
<tag name="b"/>
<endtag name="c"/>
<tag name="d"/>
<endtag name="e"/>
</something>
<endtag name="f"/>
</root>
恐怕您的问题定义不明确,示例不明确。请解释此处需要应用的确切规则。看到最小但完整的XML输入和输出也会有所帮助。如果您有两种可能的情况,请展示这两种情况的示例。@michael.hor257k updated1。不能使用XSLT生成格式错误的XML文档。-2.您添加的解释听起来像是要将元素分组在tag
和endtag
之间。如果您使用的是XSLT2.0,那么这很容易做到,您可以在这里找到许多类似的示例。我不会发布答案,因为(a)您仍然没有提供我们可以使用的输入,以及(b)我仍然在猜测这里的目的是什么。@michael.hor257k如果我将每个
转换为
,每个
转换为
,这就是问题所在,因为这正是我必须转换它的方式否,使用XSLT无法做到这一点,也不需要这样做。XSLT在源树上工作,而不是在树的XML表示上工作。转换的结果也是一棵树,只有在最后,树才序列化为XML文档。你只需要改变你对这件事的想法,然后事情就变得容易了。
<?xml version="1.0" encoding="UTF-8"?>
<root>
<tag name="a"/>
<something>
<tag name="b"/>
<endtag name="c"/>
<tag name="d"/>
<endtag name="e"/>
</something>
<endtag name="f"/>
</root>