XPath-基于以下同级选择节点
我有这样一个问题:XPath-基于以下同级选择节点,xpath,qml,Xpath,Qml,我有这样一个问题: /plist/dict[1]/dict/dict/dict/key/following-sibling::dict/string[string()='Algier'] 我真正想要选择的是“key”节点(就在下面的同级::dict之前) xml如下所示: <?xml version="1.0" encoding="UTF-8"?> <plist version="1.0"> <dict> <key>en_GB&l
/plist/dict[1]/dict/dict/dict/key/following-sibling::dict/string[string()='Algier']
我真正想要选择的是“key”节点(就在下面的同级::dict之前)
xml如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
<dict>
<key>en_GB</key>
<dict>
<key>Africa</key>
<dict>
<key>Algeria</key>
<dict>
<key>60390</key>
<dict>
<key>NAME</key>
<string>Algier</string>
<key>LATITUDE</key>
<string>36.7500</string>
<key>LONGITUDE</key>
<string>3.0500</string>
</dict>
<key>60391</key>
<dict>
<key>NAME</key>
<string>Some other city</string>
<key>LATITUDE</key>
<string>36.7500</string>
<key>LONGITUDE</key>
<string>3.0500</string>
</dict>
</dict>
</dict>
</dict>
</dict>
</plist>
似乎嵌套的后面的兄弟姐妹不起作用。
例如:
query: "/*/dict/dict/dict/dict/key[following-sibling::dict[1]/key[.='NAME']]"
这两者都会返回:
Error XPST0003 in file:///Users/Ali/qtprojects/welocationtest-build-simulator/welocationtest.app/Contents/MacOS/welocationtest, at line 2, column 97: syntax error, unexpected ], expecting )
Error XPST0003 in file:///Users/Ali/qtprojects/welocationtest-build-simulator/welocationtest.app/Contents/MacOS/welocationtest, at line 2, column 91: syntax error, unexpected ], expecting end of file
file:///Users/Ali/qtprojects/welocationtest-build-simulator/welocationtest.app/Contents/Resources/qml/welocationtest/main.qml:17:9: QML XmlRole: invalid query: "name()"
Location Model Ready
0
QML是否可能不符合XPath标准?该解决方案适用于所有其他路径编辑器 选择所需的
键
元素的XPath表达式如下所示:
/*/dict/dict/dict/dict
/key
[following-sibling::dict[1]/key
[.='NAME'
and
following-sibling::string[1] = $pCity
]
]
<key>60390</key>
<key>60391</key>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:param name="pCity" select="'Some other city'"/>
<xsl:template match="/">
<xsl:copy-of select=
"/*/dict/dict/dict/dict
/key
[following-sibling::dict[1]/key
[.='NAME'
and
following-sibling::string[1] = $pCity
]
]
"/>
</xsl:template>
</xsl:stylesheet>
<plist version="1.0">
<dict>
<key>en_GB</key>
<dict>
<key>Africa</key>
<dict>
<key>Algeria</key>
<dict>
<key>60390</key>
<dict>
<key>NAME</key>
<string>Algier</string>
<key>LATITUDE</key>
<string>36.7500</string>
<key>LONGITUDE</key>
<string>3.0500</string>
</dict>
<key>60391</key>
<dict>
<key>NAME</key>
<string>Some other city</string>
<key>LATITUDE</key>
<string>36.7500</string>
<key>LONGITUDE</key>
<string>3.0500</string>
</dict>
</dict>
</dict>
</dict>
</dict>
</plist>
<key>60391</key>
<xsl:param name="pCity" select="'Some other city'"/>
<xsl:param name="pCity" select="'Algier'"/>
<key>60390</key>
当$pCity被“Algier”
设置/替换时,此XPath表达式将选择:
/*/dict/dict/dict/dict
/key
[following-sibling::dict[1]/key
[.='NAME'
and
following-sibling::string[1] = $pCity
]
]
<key>60390</key>
<key>60391</key>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:param name="pCity" select="'Some other city'"/>
<xsl:template match="/">
<xsl:copy-of select=
"/*/dict/dict/dict/dict
/key
[following-sibling::dict[1]/key
[.='NAME'
and
following-sibling::string[1] = $pCity
]
]
"/>
</xsl:template>
</xsl:stylesheet>
<plist version="1.0">
<dict>
<key>en_GB</key>
<dict>
<key>Africa</key>
<dict>
<key>Algeria</key>
<dict>
<key>60390</key>
<dict>
<key>NAME</key>
<string>Algier</string>
<key>LATITUDE</key>
<string>36.7500</string>
<key>LONGITUDE</key>
<string>3.0500</string>
</dict>
<key>60391</key>
<dict>
<key>NAME</key>
<string>Some other city</string>
<key>LATITUDE</key>
<string>36.7500</string>
<key>LONGITUDE</key>
<string>3.0500</string>
</dict>
</dict>
</dict>
</dict>
</dict>
</plist>
<key>60391</key>
<xsl:param name="pCity" select="'Some other city'"/>
<xsl:param name="pCity" select="'Algier'"/>
<key>60390</key>
基于XSLT的验证:
/*/dict/dict/dict/dict
/key
[following-sibling::dict[1]/key
[.='NAME'
and
following-sibling::string[1] = $pCity
]
]
<key>60390</key>
<key>60391</key>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:param name="pCity" select="'Some other city'"/>
<xsl:template match="/">
<xsl:copy-of select=
"/*/dict/dict/dict/dict
/key
[following-sibling::dict[1]/key
[.='NAME'
and
following-sibling::string[1] = $pCity
]
]
"/>
</xsl:template>
</xsl:stylesheet>
<plist version="1.0">
<dict>
<key>en_GB</key>
<dict>
<key>Africa</key>
<dict>
<key>Algeria</key>
<dict>
<key>60390</key>
<dict>
<key>NAME</key>
<string>Algier</string>
<key>LATITUDE</key>
<string>36.7500</string>
<key>LONGITUDE</key>
<string>3.0500</string>
</dict>
<key>60391</key>
<dict>
<key>NAME</key>
<string>Some other city</string>
<key>LATITUDE</key>
<string>36.7500</string>
<key>LONGITUDE</key>
<string>3.0500</string>
</dict>
</dict>
</dict>
</dict>
</dict>
</plist>
<key>60391</key>
<xsl:param name="pCity" select="'Some other city'"/>
<xsl:param name="pCity" select="'Algier'"/>
<key>60390</key>
对提供的XML文档应用此转换时:
/*/dict/dict/dict/dict
/key
[following-sibling::dict[1]/key
[.='NAME'
and
following-sibling::string[1] = $pCity
]
]
<key>60390</key>
<key>60391</key>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:param name="pCity" select="'Some other city'"/>
<xsl:template match="/">
<xsl:copy-of select=
"/*/dict/dict/dict/dict
/key
[following-sibling::dict[1]/key
[.='NAME'
and
following-sibling::string[1] = $pCity
]
]
"/>
</xsl:template>
</xsl:stylesheet>
<plist version="1.0">
<dict>
<key>en_GB</key>
<dict>
<key>Africa</key>
<dict>
<key>Algeria</key>
<dict>
<key>60390</key>
<dict>
<key>NAME</key>
<string>Algier</string>
<key>LATITUDE</key>
<string>36.7500</string>
<key>LONGITUDE</key>
<string>3.0500</string>
</dict>
<key>60391</key>
<dict>
<key>NAME</key>
<string>Some other city</string>
<key>LATITUDE</key>
<string>36.7500</string>
<key>LONGITUDE</key>
<string>3.0500</string>
</dict>
</dict>
</dict>
</dict>
</dict>
</plist>
<key>60391</key>
<xsl:param name="pCity" select="'Some other city'"/>
<xsl:param name="pCity" select="'Algier'"/>
<key>60390</key>
英国
非洲
阿尔及利亚
60390
名称
阿尔及尔
纬度
36.7500
经度
3.0500
60391
名称
其他城市
纬度
36.7500
经度
3.0500
生成所需的正确结果:
/*/dict/dict/dict/dict
/key
[following-sibling::dict[1]/key
[.='NAME'
and
following-sibling::string[1] = $pCity
]
]
<key>60390</key>
<key>60391</key>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:param name="pCity" select="'Some other city'"/>
<xsl:template match="/">
<xsl:copy-of select=
"/*/dict/dict/dict/dict
/key
[following-sibling::dict[1]/key
[.='NAME'
and
following-sibling::string[1] = $pCity
]
]
"/>
</xsl:template>
</xsl:stylesheet>
<plist version="1.0">
<dict>
<key>en_GB</key>
<dict>
<key>Africa</key>
<dict>
<key>Algeria</key>
<dict>
<key>60390</key>
<dict>
<key>NAME</key>
<string>Algier</string>
<key>LATITUDE</key>
<string>36.7500</string>
<key>LONGITUDE</key>
<string>3.0500</string>
</dict>
<key>60391</key>
<dict>
<key>NAME</key>
<string>Some other city</string>
<key>LATITUDE</key>
<string>36.7500</string>
<key>LONGITUDE</key>
<string>3.0500</string>
</dict>
</dict>
</dict>
</dict>
</dict>
</plist>
<key>60391</key>
<xsl:param name="pCity" select="'Some other city'"/>
<xsl:param name="pCity" select="'Algier'"/>
<key>60390</key>
60391
在上述转换中,我们将替换:
/*/dict/dict/dict/dict
/key
[following-sibling::dict[1]/key
[.='NAME'
and
following-sibling::string[1] = $pCity
]
]
<key>60390</key>
<key>60391</key>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:param name="pCity" select="'Some other city'"/>
<xsl:template match="/">
<xsl:copy-of select=
"/*/dict/dict/dict/dict
/key
[following-sibling::dict[1]/key
[.='NAME'
and
following-sibling::string[1] = $pCity
]
]
"/>
</xsl:template>
</xsl:stylesheet>
<plist version="1.0">
<dict>
<key>en_GB</key>
<dict>
<key>Africa</key>
<dict>
<key>Algeria</key>
<dict>
<key>60390</key>
<dict>
<key>NAME</key>
<string>Algier</string>
<key>LATITUDE</key>
<string>36.7500</string>
<key>LONGITUDE</key>
<string>3.0500</string>
</dict>
<key>60391</key>
<dict>
<key>NAME</key>
<string>Some other city</string>
<key>LATITUDE</key>
<string>36.7500</string>
<key>LONGITUDE</key>
<string>3.0500</string>
</dict>
</dict>
</dict>
</dict>
</dict>
</plist>
<key>60391</key>
<xsl:param name="pCity" select="'Some other city'"/>
<xsl:param name="pCity" select="'Algier'"/>
<key>60390</key>
与:
/*/dict/dict/dict/dict
/key
[following-sibling::dict[1]/key
[.='NAME'
and
following-sibling::string[1] = $pCity
]
]
<key>60390</key>
<key>60391</key>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:param name="pCity" select="'Some other city'"/>
<xsl:template match="/">
<xsl:copy-of select=
"/*/dict/dict/dict/dict
/key
[following-sibling::dict[1]/key
[.='NAME'
and
following-sibling::string[1] = $pCity
]
]
"/>
</xsl:template>
</xsl:stylesheet>
<plist version="1.0">
<dict>
<key>en_GB</key>
<dict>
<key>Africa</key>
<dict>
<key>Algeria</key>
<dict>
<key>60390</key>
<dict>
<key>NAME</key>
<string>Algier</string>
<key>LATITUDE</key>
<string>36.7500</string>
<key>LONGITUDE</key>
<string>3.0500</string>
</dict>
<key>60391</key>
<dict>
<key>NAME</key>
<string>Some other city</string>
<key>LATITUDE</key>
<string>36.7500</string>
<key>LONGITUDE</key>
<string>3.0500</string>
</dict>
</dict>
</dict>
</dict>
</dict>
</plist>
<key>60391</key>
<xsl:param name="pCity" select="'Some other city'"/>
<xsl:param name="pCity" select="'Algier'"/>
<key>60390</key>
并再次应用转换,然后再次得到正确的结果:
/*/dict/dict/dict/dict
/key
[following-sibling::dict[1]/key
[.='NAME'
and
following-sibling::string[1] = $pCity
]
]
<key>60390</key>
<key>60391</key>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:param name="pCity" select="'Some other city'"/>
<xsl:template match="/">
<xsl:copy-of select=
"/*/dict/dict/dict/dict
/key
[following-sibling::dict[1]/key
[.='NAME'
and
following-sibling::string[1] = $pCity
]
]
"/>
</xsl:template>
</xsl:stylesheet>
<plist version="1.0">
<dict>
<key>en_GB</key>
<dict>
<key>Africa</key>
<dict>
<key>Algeria</key>
<dict>
<key>60390</key>
<dict>
<key>NAME</key>
<string>Algier</string>
<key>LATITUDE</key>
<string>36.7500</string>
<key>LONGITUDE</key>
<string>3.0500</string>
</dict>
<key>60391</key>
<dict>
<key>NAME</key>
<string>Some other city</string>
<key>LATITUDE</key>
<string>36.7500</string>
<key>LONGITUDE</key>
<string>3.0500</string>
</dict>
</dict>
</dict>
</dict>
</dict>
</plist>
<key>60391</key>
<xsl:param name="pCity" select="'Some other city'"/>
<xsl:param name="pCity" select="'Algier'"/>
<key>60390</key>
60390
要获取一个城市的数字,您也可以使用正则表达式(特别是在QML XPath支持不够好的情况下):
导入QtQuick 1.0
长方形{
id:集装箱
宽度:360
身高:360
Component.onCompleted:{
LoadWeLocationFile();
}
属性字符串weLocationsXML
信号weLocationsLoaded()
函数LoadWeLocationFile(){
//加载文件
var doc=新的XMLHttpRequest();
doc.onreadystatechange=函数(){
if(doc.readyState==XMLHttpRequest.DONE){
//获取文件内容
weLocationsXML=doc.responseText;
//发射信号
weLocationsLoaded();
}
}
打开文档(“GET”、“we_locations.plist”);
doc.send();
}
函数getIDByName(名称){
//转义正则表达式的特殊字符(可能有更好的方法)
var safeName=name.replace(/[-,?+*\\^$()[\]{}\\\\\\\]]/g,“\\$&”);
//创建正则表达式
var regex=new RegExp(“(**?\\s*\\s*NAME\\s*”+safeName+”,“m”);
//执行正则表达式
var match=regex.exec(weLocationsXML);
if(match!=null&&match.length>1){
返回匹配项[1];//找到名称,组1包含id
}否则{
返回null;//在XML中没有这样的名称
}
}
//测试它。。。
onWeLocationsLoaded:{
log(“阿尔及尔”的编号:”,getIDByName(“阿尔及尔”);
log(“NotInXML”的编号:”,getIDByName(“NotInXML”);
log(“某个其他城市的编号:”,getIDByName(“某个其他城市”);
}
}
输出:
Number for 'Algier': 60390
Number for 'NotInXML': null
Number for 'Some other city': 60391
如果您需要QML模型中的数字,您可以创建一个
ListModel
并将数字添加到其中。Hmm,听起来很合理。尽管我必须在QML中检查它,以真正将其标记为正确答案。我将在这段时间内投票,因为我似乎正在使用其他工具。:)德文:不用谢。如果QML实现了XPath(正如它应该实现的那样),那么它应该会使用此解决方案产生所需的结果。似乎QML存在缺陷且不符合要求……难怪诺基亚现在正处于这样的境地:(我看了一遍,我同意,如果QML在给定的XPath表达式上抛出上述错误,那么QML有一个bug。为什么它会期望一个)
,而没有(
?你能提交一个bug报告吗?这个错误似乎是针对:查询:“name()”;
。您想在这里具体说明什么?太棒了。非常感谢:)。现在解决了我的问题。