말, 나는메모리에서 XML 구조를 탐색하고 하위를 바꾸는 방법은 무엇입니까?
<something>
<parent>
<child>Bird is the word 1.</child>
<child>Curd is the word 2.</child>
<child>Nerd is the word 3.</child>
</parent>
<parent>
<child>Bird is the word 4.</child>
<child>Word is the word 5.</child>
<child>Bird is the word 6.</child>
</parent>
</something>
내가 문서를 통과하고 XQuery를 사용하여 "개"와 MarkLogic API의와 단어 "새"를 대체하고자하는 문서 수준을 가지고있다. 지금까지 나는
<something>
<parent>
<child>Dog is the word 1.</child>
<child>Curd is the word 2.</child>
<child>Nerd is the word 3.</child>
</parent>
<parent>
<child>Dog is the word 4.</child>
<child>Word is the word 5.</child>
<child>Dog is the word 6.</child>
</parent>
</something>
어떻게 루프를 중첩하지 않고 달성 할 수있는 다음과 같은 코드 -
let $doc := $DOC
return <something>
{for $d at $y in $doc/element()
let $p := <parent>
{for $c in $d/element()
let $child := if(fn:matches($c, "Bird")) then(<child>{fn:replace($c, "Bird", "Dog")}</child>) else($c)
return $child
}</parent>
return $p}
</something>
결과로 달성 할 수 있습니다 무엇입니까? 이 질문은 이전에 XSLT를 사용하여 요청되었습니다.
** s/Bird/Dog/g **와 같은 정규 표현식을 사용하지 않는 이유는 무엇입니까? 단일 패스에서 선형 시간으로 완료됩니다. – Wontonimo
@wontonimo 직렬화 된 XML에서 문자열 조작을 수행하는 것이 가능하지만 나쁜 관행으로 간주됩니다. 또한 실제로 필요한 곳에서만 변경 사항을 적용하는 것이 훨씬 더 어렵습니다. 단일 패스 문자열을 사용하면 다른 요소 또는 속성의 내용이 아닌'child' 요소의 내용 만 변경하는 것이 어렵습니다. 더 중요한 것은 실수로 XML 태그의 이름을 바꾸거나 악화되어 XML 태그가 손상되거나 제거되는 등 XML의 올바른 형식을 엉망으로 만들 위험이 없다는 것입니다. – grtjn
@grtjn - xml 태그를 정규식에 추가 할 수 있지만 ** **/(\> [^ \ <] *) Bird ([^ \ <] * \ <)/$ 1Dog $ 2/g ** ** ** ** ** ** ** ** ** child **를 확인하면 태그 내부에서 수정되지 않고 태그 사이에 ** child ** 단어 만 수정된다는 것을 알 수 있습니다. – Wontonimo