Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 通过xsl移动标记部件_Xml_Xslt_Xpath - Fatal编程技术网

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>