如何在另一个for循环中使用for循环来使用XQuery?

如何在另一个for循环中使用for循环来使用XQuery?,xquery,Xquery,在解析任何类似于下面的XML时,为了获取路径/测试路径和别名 <TEST TEST_VERSION="14"> <TEST_QUERY_LIST PROP="0"> <TEST_QUERY_FILE>"C:/Files/File.txt"</TEST_QUERY_FILE> </TEST_QUERY_LIST> <TEST_OUTPUT> <FILE PATH="C:/Files/File2.txt" T

在解析任何类似于下面的XML时,为了获取路径/测试路径和别名

<TEST TEST_VERSION="14">
 <TEST_QUERY_LIST PROP="0">
  <TEST_QUERY_FILE>"C:/Files/File.txt"</TEST_QUERY_FILE>
 </TEST_QUERY_LIST>
 <TEST_OUTPUT>
  <FILE PATH="C:/Files/File2.txt" TEST_TYPE_ID_REF="1">
   <USED_BY TEST_PATH="C:/Files/File2.txt" ALIAS="thisData"/>
   <USED_BY TEST_PATH="C:/Files/File3.txt" ALIAS="thatData"/>
  </FILE>
  <FILE PATH="C:/Files/File1.txt" TEST_TYPE_ID_REF="1">
   <USED_BY TEST_PATH="C:/Files/File5.txt" ALIAS="Data"/>
  </FILE>
 </TEST_OUTPUT>
</TEST>
但问题是输出是随机的,即:我不能将输出关联成关系

我很乐意得到PATH、TEST_PATH和ALIAS相关的输出 比如::

"C:/Files/File2.txt", "C:/Files/File2.txt", "thisData"
"C:/Files/File2.txt", "C:/Files/File3.txt", "thatData"
"C:/Files/File1.txt", "C:/Files/File5.txt", "Data"
经过一番思考,我试着这样修改它

.....setQuery(
  "for $x in doc($xmlByteArry)//TEST/TEST_OUTPUT/FILE"
  " for $y in $x/USED_BY "
  " return if($x/@TEST_TYPE_ID_REF = 1) "
  " then concat ($y/@TEST_PATH, ':::', $y/@ALIAS, ':::', $x/@PATH ) "
  " else ()");
当计算此查询时,我得到一个异常。有没有提示它为什么无法识别XML?我使用以下代码(C++/Qt)


您使用什么实现来执行XQuery?可能会发布您得到的异常?您的查询似乎在我的XQuery处理器(emc xDB)上运行。请查看说明中编辑的代码。
.....setQuery(
  "for $x in doc($xmlByteArry)//TEST/TEST_OUTPUT/FILE"
  " for $y in $x/USED_BY "
  " return if($x/@TEST_TYPE_ID_REF = 1) "
  " then concat ($y/@TEST_PATH, ':::', $y/@ALIAS, ':::', $x/@PATH ) "
  " else ()");
QString getParsedString()
{
   QByteArray xmlByteArry;
   QBuffer device(&xmlByteArry);
   device.setData(XmlTree().toUtf8());
   device.open(QIODevice::ReadOnly);

   QXmlQuery query;
   query.bindVariable("xmlByteArry", &device);
//    query.setQuery("for $x in doc($xmlByteArry)//TEST/TEST_OUTPUT/FILE"
//       " return if($x/@TEST_TYPE_ID_REF = 1) "
//       " then ($x/USED_BY/@TEST_PATH,':::',$x/USED_BY/@ALIAS,':::',$x/@PATH) "
//       " else ()");

   query.setQuery("for $x in doc($xmlByteArry)//TEST/TEST_OUTPUT/FILE"
      " for $y in $x/USED_BY "
      " return if($x/@TEST_TYPE_ID_REF = 1) "
      " then concat($y/@TEST_PATH,':::',$y/@ALIAS,':::',$x/@PATH)"
      " else ()");

   QString values;
   if(query.isValid())
   {
      QXmlResultItems result;
      query.evaluateTo(&result);
      QXmlItem XmlItem(result.next());
      while (!XmlItem.isNull()) 
      {
         //Code to parse the Internal ones
         if(XmlItem.isAtomicValue())
         {
            //I hope some values will be atomic like ALIAS and TEST_PATH
            values.append(XmlItem.toAtomicValue().toString());
         }
         else if (XmlItem.isNode()) 
         {
            //I hope to get the FILE Node and USED_BY node but I dont see anything in the following stringValue.
            QXmlNodeModelIndex Index = XmlItem.toNodeModelIndex();
            values.append(Index.stringValue());
         }
         XmlItem = result.next();
      }
   }

   return values;
}