簡體   English   中英

xpath表達式強制返回不存在的節點

[英]xpath expression to force to return absent nodes

<matrix id="2x2withNulls">
    <row>
        <column num="1">346</column>
    </row>
    <row>
        <column num="1">444</column>
        <column num="2">56</column>
    </row>
</matrix>

我需要遍歷整個矩陣,是否有任何方法可以強制表達式在null處創建節點?

理想情況下, /matrix/row/column某種方式返回四個預期節點。

/matrix/row/column[as many as max(foreach /matrix/column/)] ,如有必要則復制,或/matrix/row/column[not(exists num where exists in other colum)-> create it]

我只能使用一個表達式,因為該表達式是第三方應用程序的參數。

也許必須有一種方法可以強制導致第一行重復num1列,因此即使它們是半空行中最后一個existintg列的重復,它也始終會返回max(columns)。

“選擇一個不存在的節點”的概念很有趣,但很可能會導致您走錯路。 正如一些哲學家曾經提到的上帝,存在不是謂詞。 您不能選擇所有不存在的節點。

棘手的是您的陳述“我只能使用一個表達式,因為該表達式是第三方應用程序的參數”。 盡管您已在問題中包括XSLT標記,但這似乎排除了XSLT。 因此,我認為最好更精確地了解約束條件。

我會稍微調整Erat的解決方案:

return <matrix> {
  $matrix/@*,
  for $row in $matrix/row
  return <row> {
    for $i in 1 to 2
    return ($row/column[@num=$i], <column num="{$i}"/>)[1]
  } </row>
}</matrix>

如果您是自己創建xml ,則可以先確保它針對xsd進行驗證,該xsdsequenceminOccursmaxOccurs設置為所需的計數。 這樣就可以有效地限制節點本身的數量。

這里閱讀xsd sequence

如果您LinqToXml第三方應用程序中獲取此xml,但要包含空節點,則可以使用LinqToXml (假設您可以在項目中使用C#,並且還假設xDoc是包含xmlXDocument ):

public void AddEmptyNodesIf(XDocument xDoc, int targetElementCount = 4)
{
    XElement e = new XElement("column");
    e.Add(new XAttribute("num", null));

    foreach (XElement row in xDoc.Elements("row"))
    {
        int lastOccurringId = int.Parse(row.Elements("column")
            .Last().Attribute("num").Value);

        while (row.Elements("column").Count() < targetElementCount)
        {
            lastOccurringId++;
            e.Attribute("num").Value = lastOccurringId.ToString();
            row.Add(e);
        }
    }
}

請注意,我沒有對此進行測試,但是即使它不能完全正常工作,您也可以大致了解它。

您將必須重建結果,並在必要時創建新列。

let $matrix :=
  <matrix id="2x2withNulls">
    <row>
      <column num="1">346</column>
    </row>
    <row>
      <column num="1">444</column>
      <column num="2">56</column>
    </row>
  </matrix>

return element matrix {
  $matrix/@*,
  for $row in $matrix/row
  return element row {
    for $i in 1 to 2
    return
      if ($row/column[@num=$i])
      then $row/column[@num=$i]
      else element column { attribute num { $i }}
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM