XSLT: คัดลอกโหนด xml เพียงไม่กี่โหนดไปยังตัวแปร

มีวิธีคัดลอก 2 หรือ 3 โหนดของ XML ไปยังตัวแปรโดยใช้ XSLT หรือไม่ ฉันกำลังมองหาโหนดไม่ใช่ค่าโหนด

XML ตัวอย่างของฉันคือ:

<node1>
  <node2>
    <node3>abc</node3> 
    <node4>def</node4> 
  </node2>
</node1>
<node1>
  <node2>
    <node3>123</node3> 
    <node4>456</node4> 
  </node2>
</node1>

และตัวอย่าง XSLT ของฉันคือ:

<xsl:for-each select="/node1/node2">
  <xsl:if test="current()/node4 ! = '456'">
    <xsl:copy-of select="./node3" />
    <xsl:copy-of select="./node4" />
  </xsl:if>
</xsl:foreach>

ปัญหานี้คือฉันได้รับ node4 ทุกครั้งเป็นโหนดแรกของ XML แทนที่จะเป็นโหนดปัจจุบัน เมื่อวันที่ node3 ฉันได้รับอันปัจจุบันแล้วและก็ไม่มีปัญหา


person rgu    schedule 29.12.2016    source แหล่งที่มา
comment
เอาต์พุตของฉันควรเป็นค่าของ node3 และ node4 เป็นไฟล์แฟลต และควรกำจัดรายการที่ซ้ำกันออก และควรทำงานเร็วมากด้วย เนื่องจากอินพุตมีขนาดใหญ่ถึง 20MB   -  person rgu    schedule 30.12.2016


คำตอบ (2)


ปัญหาของคุณอาจเกิดจากปัญหา RTF (Resulting Tree Fragment) ของ XSLT-1.0:

ตัวแปรไม่สามารถมีชุดโหนดได้ (แต่มีเพียง RTF เท่านั้น)

ฉันอธิบายปัญหานี้ในคำตอบ SO นี้

ไม่สามารถสืบค้น RTF ด้วยนิพจน์ XPath-1.0 ได้ ดังนั้นจึงมีประโยชน์เฉพาะในสถานการณ์ย่อยที่จำกัดมากเท่านั้น

วิธีแก้ไขประการหนึ่งคือการใช้ XSLT-2.0 ที่ใหม่กว่า .

person zx485    schedule 29.12.2016
comment
ขอบคุณ @zx485 มีวิธีแก้ไขปัญหานี้แทนการใช้ xslt 2.0 หรือไม่ - person rgu; 30.12.2016
comment
@rgu: น่าเสียดายที่ไม่มีที่ฉันรู้ :-( ไม่เช่นนั้นฉันจะรวมสิ่งนั้นไว้ในคำตอบด้วย - person zx485; 30.12.2016
comment
คุณสามารถแปลง rtf เป็นชุดโหนดได้โดยใช้ฟังก์ชันชุดโหนด ดูลิงก์: xml.com/pub/a/2003/ 16/07/nodeset.html - person Bluewood66; 30.12.2016

อาจช่วยให้คุณเลือกโหนดที่คุณต้องการทั้งหมดในคราวเดียว

<xsl:variable name="sample">
   <xsl:copy-of select="/node1/node2[node4!='456']/*[name()='node3' or name()='node4']"/>
</xsl:variable>
person Bluewood66    schedule 29.12.2016