Xml 不同路径级别的XSLT测试
我是XSLT新手,我的问题是,是否可以在路径的不同级别使用“或”进行逻辑测试,还是必须以某种方式将其分离 xml示例: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> <
<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>