Xml 不同路径级别的XSLT测试

Xml 不同路径级别的XSLT测试,xml,xslt,xslt-1.0,Xml,Xslt,Xslt 1.0,我是XSLT新手,我的问题是,是否可以在路径的不同级别使用“或”进行逻辑测试,还是必须以某种方式将其分离 xml示例: <LandXML> <HexagonLandXML> <Point lineworkFlag="START LINJE"> <PointCode codeLinework="open line"> </PointCode> <

我是XSLT新手,我的问题是,是否可以在路径的不同级别使用“或”进行逻辑测试,还是必须以某种方式将其分离

xml示例:

<LandXML>
    <HexagonLandXML>
        <Point lineworkFlag="START LINJE">
            <PointCode codeLinework="open line">
            </PointCode>
        </Point>
    </HexagonLandXML>
</LandXML>

示例xls:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" 
  xmlns:landxml="http://www.landxml.org/schema/LandXML-1.2" 
  xmlns:hexagon="http://xml.hexagon.com/schema/HeXML-1.7" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text" 
              version="1.0" 
              encoding="UTF-16" 
              indent="no" 
              omit-xml-declaration="yes"/>

  <xsl:variable name="XML" select="/"/>

  <xsl:template match="/">
    <xsl:for-each select="$XML">
      <xsl:for-each select="landxml:LandXML/hexagon:HexagonLandXML/hexagon:Point">
        <xsl:for-each select="hexagon:PointCode">
          <xsl:when test="../following-sibling::*[1]
                          /hexagon:PointCode[@codeLinework='none'] 
                          or 
                          ../../following-sibling::*[1]
                          /hexagon:Point[@lineworkFlag='START LINJE']">
            do something...
          </xsl:when>
        </xsl:for-each>
      </xsl:for-each>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

做点什么。。。

欢迎来到堆栈溢出

由于您没有提到任何错误消息的文本,我猜您没有收到任何错误。尽管如此,您还是会问自己是否可以做代码正在做的事情,我猜您没有得到想要或期望的结果。既然我不能完全确定你所说的“在不同的路径层次上用‘或’逻辑地测试”或“以某种方式将其分离”是什么意思,我必须猜测一下你的意思。(这是一个很大的猜测;如果我的任何猜测都是错误的,这个答案不会有多大帮助。)

我认为您最初想问的问题可能是这样的:当
的两个操作数是在两个完全不同的元素上进行测试时,编写一个顶级运算符为
test
属性是否合法?或者必须将测试限制在一个
test
属性中,这样它们就不会在整个输入中漫游?或者换句话说,这合法吗

<xsl:when test="../following-sibling::*[1]
                /hexagon:PointCode[@codeLinework='none'] 
                or 
                ../../following-sibling::*[1]
                /hexagon:Point[@lineworkFlag='START LINJE']">
  do something...
</xsl:when> 
如果您的输入如示例所示是规则的,那么您的条件可以归结为“下一个PointCode元素具有@codeLinework='none'或下一个Point元素具有@lineworkFlag='START LINJE”。如果是这样,那么条件可以稍微缩短:

  <xsl:template match="hexagon:PointCode
                         [following::hexagon:PointCode[1]
                          /@codeLinework = 'none'
                          or
                          following::hexagon:Point[1]
                          @lineworkFlag='START LINJE']">
     do something...
  </xsl:template>

做点什么。。。

这种情况的复杂性可能会向一些读者(对我来说是这样)建议更改XML的设计以允许更直接的处理。但这超出了您的问题范围。

不惜一切代价避免对每个
使用
并使用
xsl:template match=”“
这个问题不清楚。发布一个有意义的XML示例(包括所有namespce),并解释您想要实现什么以及在当前代码的哪个部分遇到了问题。我同意这个问题不清楚。尤其是因为两个表达式都指向同一个级别——如果PointCode是point的子级,则不太可能工作。通常,没有理由不使用OR组合指向两个完全不同节点的两个表达式。每一个表达式都将被独立地计算,P.S.绝对没有理由避免对每一个
使用
xsl:for。现在还不清楚为什么需要这样做。还请显示您期望从转换中获得的输出。也许没有必要,谢谢。即使我不清楚,你还是假设正确,为我指明了正确的方向。XML将使用某种返工,但我无法控制XML。
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" 
  xmlns:landxml="http://www.landxml.org/schema/LandXML-1.2" 
  xmlns:hexagon="http://xml.hexagon.com/schema/HeXML-1.7" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text" 
              version="1.0" 
              encoding="UTF-16" 
              indent="no" 
              omit-xml-declaration="yes"/>

  <xsl:template match="hexagon:Point
                         [following-sibling::*[1]
                          /hexagon:PointCode
                          /@codeLinework = 'none']
                       /hexagon:PointCode">
    <xsl:call-template name="do-something"/>
  </xsl:template>

  <!--* pattern on following template seems likely wrong *-->
  <xsl:template match="hexagon:HexagonLandXML
                         [following-sibling::*[1]
                          /hexagon:Point
                          /@lineworkFlag = 'START LINJE']                          
                       //hexagon:PointCode">
    <xsl:call-template name="do-something"/>
  </xsl:template>

  <xsl:template name="do-something">
    do something ...
  </xsl:template>
</xsl:stylesheet>
  <xsl:template match="hexagon:PointCode
                         [following::hexagon:PointCode[1]
                          /@codeLinework = 'none'
                          or
                          following::hexagon:Point[1]
                          @lineworkFlag='START LINJE']">
     do something...
  </xsl:template>