我想修改现有的xsl文件,以便只有在跟随另一个不是此标记的兄弟时,才会转换源文档中的标记<Empty>
。一种截断这些标签到最后。
目前我有:
...
<xsl:template match="Expression">
<xsl:value-of select="."/>
</xsl:template>
<xsl:template match="Empty">
<xsl:value-of select="."/>
</xsl:template>
可以用xslt实现吗?
示例输入
<root>
<dummy1>Test1</dummy1>
<Empty>Empty1</Empty>
<Empty>Empty2</Empty>
<dummy2>Test2</dummy2>
<Empty>Empty3</Empty>
<Empty>Empty4</Empty>
<Empty>Empty5</Empty>
</root>
期望的输出:
Test1Empty1Empty2Test2
答案 0 :(得分:1)
请使用XSLT发布一个小输入样本和您想要创建的相应结果。在XPath中有一个兄弟轴,所以做例如:
<xsl:template match="Empty[following-sibling::*[1][not(self::Empty)]]">
<!-- now transform here as needed -->
</xsl:template>
匹配任何Empty
元素,后跟另一个不是Empty
元素的元素,但我不确定您是否需要以及您希望在模板内执行的操作。
答案 1 :(得分:1)
假设输入XML为:
<?xml version="1.0" encoding="utf-8"?>
<root>
<dummy1>test</dummy1>
<Empty>do-not-copy</Empty>
<Empty>copy-this1</Empty>
<dummy2>test</dummy2>
<Empty>do-not-copy-this2</Empty>
</root>
在上面的XML中,第二个元素<Empty>do-not-copy</Empty>
的下一个兄弟作为<Empty>copy-this1</Empty>
,所以不应该选择它。其中第三个元素后跟<dummy2/>
所以它应该被复制..
第五个元素是<Empty>copy-this2</Empty>
它后面没有任何标记..所以它也应该被删除:)
这是XSL代码:
<xsl:template match="Empty[following-sibling::*[1][name()!='Empty']]">
<xsl:value-of select="."/>
</xsl:template>
答案 2 :(得分:0)
我将建议的解决方案修改为以下内容:
<xsl:template match="Empty[following-sibling::*[not(self::Empty)]]">
<xsl:value-of select="."/>
</xsl:template>
似乎有用。
答案 3 :(得分:0)
我正在添加一个新答案..
如果这是你的XML:
<?xml version="1.0" encoding="utf-8"?>
<root>
<dummy>test</dummy>
<Empty>copy-this</Empty>
<Empty>copy-this1</Empty>
<dummy>test</dummy>
<Empty>copy-this</Empty>
<Empty>copy-this1</Empty>
<dummy>test</dummy>
<Empty>donot-copy-this2</Empty>
<Empty>donot-copy-this2</Empty>
</root>
XSLT:示例代码..
<xsl:template match="dummy">
<xsl:value-of select="."/>
</xsl:template>
<xsl:template match="Empty[following-sibling::*[name()!='Empty']]">
<xsl:value-of select="."/>
</xsl:template>
<xsl:template match="text()"/>
输出:
testcopy-thiscopy-this1testcopy-thiscopy-this1test