[英]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
進行驗證,該xsd
的sequence
將minOccurs
和maxOccurs
設置為所需的計數。 這樣就可以有效地限制節點本身的數量。
在這里閱讀xsd
sequence
。
如果您LinqToXml
第三方應用程序中獲取此xml,但要包含空節點,則可以使用LinqToXml
(假設您可以在項目中使用C#,並且還假設xDoc
是包含xml
的XDocument
):
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.