我正在尝试使用样式shhet来转换此XML
<?xml version="1.0" encoding="UTF-8"?>
<h>
<m>
<c name="HM">G</c>
<c name="HL">20</c>
<c name="HS">f</c>
</m>
<m>
<c name="HM">L</c>
<c name="HL">30</c>
<c name="HS">t</c>
</m>
<m>
<c name="HM">S</c>
<c name="HL">10</c>
<c name="HS">t</c>
</m>
</h>
这是样式表
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/>
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="//h/m/c[@name='HM' and text()='G']/following-sibling::column[@name='HS']"/>
</xsl:stylesheet>
此模板匹配表达式行不起作用,给出此错误xsltCompileStepPattern:&#39; child&#39;或者&#39;属性&#39;预期
但是在命令行中,匹配表达式给出了这个结果
xmllint --xpath "//h/m/c[@name='HM' and text()='G']/following-sibling::c[@name='HS']" test.xml
<c name="HS">f</c>
有人可以解释为什么会这样,以及我如何修复样式表
感谢您寻找
答案 0 :(得分:1)
实际错误是因为&#34;跟随兄弟&#34;模板匹配中的路径中不允许使用。 (你的表达式也在寻找不在你的XML中的column
,但我认为这是一个错字,并且它实际上不会导致错误。)
您尚未指定实际尝试的内容,但根据您当前的尝试,您似乎正在尝试匹配&#34; HS&#34;跟随&#34; HM&#34;。
的c
节点
尝试反转逻辑并改为使用此表达式
<xsl:template match="/h/m/c[@name='HS'][preceding-sibling::c[@name='HM' and text()='G']]"/>