XSLT编译错误但Xpath评估

时间:2018-02-08 14:27:22

标签: xml xslt

我正在尝试使用样式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>

有人可以解释为什么会这样,以及我如何修复样式表

感谢您寻找

1 个答案:

答案 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']]"/>