วิธีรับข้อความ HTML ใน XML ผ่าน XSL

ดูเหมือนว่า exclude-result-prefixes ใช้ไม่ได้กับ xsl:copy-of เมื่อฉันเรียกใช้ XML ต่อไปนี้ ผลลัพธ์จะมีเนมสเปซอยู่บนแท็ก <table> ซึ่งไม่ใช่พฤติกรรมที่ต้องการในกรณีของฉัน เป้าหมายสูงสุดคือการได้รับองค์ประกอบ DataItem ซึ่งอาจมีข้อความประเภท XML/HTML และไม่ควรแก้ไขไม่ว่าด้วยเหตุผลใดก็ตาม แล้ววิธีที่ดีที่สุดในการรับ DataItem ตามที่เป็นอยู่ คืออะไร

XML

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="test.xsl" ?>
<root>
  <E2ETraceEvent xmlns="http://schemas.microsoft.com/2004/06/E2ETraceEvent">
    <ApplicationData>
      <TraceData>
        <DataItem>
          <table>
            <tr>
              <td>This should not be a table</td>
              <td>It must be a text</td>
            </tr>
          </table>
        </DataItem>
      </TraceData>
    </ApplicationData>
  </E2ETraceEvent>
</root>

XSL

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:te="http://schemas.microsoft.com/2004/06/E2ETraceEvent"
                exclude-result-prefixes="te">
  <xsl:output method="html" indent="no"/>
  <xsl:template match="/">
      <html>
        <body>
          <table>
            <thead>
              <tr>
                <td>Data</td>
              </tr>
            </thead>
            <tbody>
              <xsl:for-each select="//te:E2ETraceEvent">
              <tr>
                <td>
                  <table>
                    <xsl:for-each select=".//te:TraceData//te:DataItem">
                      <tr>
                        <td>
                          <xmp>
                            <xsl:copy-of select="*" />
                          </xmp>
                        </td>
                      </tr>
                    </xsl:for-each>
                  </table>
                </td>
              </tr>
              </xsl:for-each>
            </tbody>
          </table>
        </body>
      </html>
  </xsl:template>  
</xsl:stylesheet>

เอาท์พุต

<table xmlns="http://schemas.microsoft.com/2004/06/E2ETraceEvent">
        <tr>
          <td>This should not be a table</td>
          <td>It must be a text</td>
        </tr>
      </table>

เอาท์พุตที่ต้องการ

<table>
        <tr>
          <td>This should not be a table</td>
          <td>It must be a text</td>
        </tr>
      </table>

person cilerler    schedule 06.02.2015    source แหล่งที่มา


คำตอบ (1)


ดังนั้นวิธีที่ดีที่สุดในการรับ DataItem คืออะไร?

วิธีที่ดีที่สุดในการรับโหนดต้นทาง ตามที่เป็นอยู่ คือการคัดลอกโหนดนั้น อย่างไรก็ตาม copy หมายถึง copy - รวมถึงเนมสเปซด้วย

หากคุณไม่ต้องการเนมสเปซ (เช่น คุณ ไม่ ต้องการรับโหนดต้นทาง เหมือนเดิม) คุณจะไม่สามารถคัดลอกได้ โหนดที่มีอยู่ คุณต้องสร้างใหม่แทน ดังนั้นแทนที่จะทำ:

<xsl:copy-of select="*"/>

do:

<xsl:apply-templates select="*"/>

แล้ว:

<xsl:template match="*"> 
    <xsl:element name="{local-name()}">
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>

โปรดทราบว่ารูปแบบนี้ไม่ได้คัดลอกแอตทริบิวต์

person michael.hor257k    schedule 06.02.2015
comment
ขอบคุณสำหรับการตอบกลับที่รวดเร็วและละเอียด เมื่อฉันพูดว่า เหมือนเดิม ฉันหมายถึงไฟล์ต้นฉบับ (XML) ไม่ใช่ไฟล์ XSL ที่ประมวลผล จากสิ่งที่คุณพูด เป็นไปไม่ได้ที่จะได้ทุกอย่างเนื่องจากไม่มีเนมสเปซ ถ้าสิ่งที่ดีที่สุดรองลงมาคือสร้างอันใหม่ ก็ไม่เป็นไร แต่ฉันกำลังมองหาวิธีแก้ปัญหาเพื่อให้ได้สิ่งที่ XML ให้ไว้ระหว่างแท็ก แม้แต่ช่องว่างก็ควรคงไว้เป็นช่องว่าง และไม่ถูกตัดออกและ/หรือเพิ่มเข้าไปใน ผลลัพธ์. คุณคิดว่ามีอะไรที่อาจทำให้เกิดปัญหาในเรื่องนั้นหรือไม่? (นอกเหนือจากแอตทริบิวต์ที่หายไป) ขอบคุณ! - person cilerler; 06.02.2015
comment
ฉันเกรงว่าคุณอาจเข้าใจบางสิ่งที่พื้นฐานมากผิด: ใน XML ต้นทางของคุณ องค์ประกอบ <table> และองค์ประกอบย่อยทั้งหมดอยู่ในเนมสเปซ xmlns="http://schemas.microsoft.com/2004/06/E2ETraceEvent" ดังนั้นตามที่อยู่ในแหล่งที่มาจึงจำเป็นต้องรวมเนมสเปซด้วย - person michael.hor257k; 06.02.2015
comment
อุ๊ปส์ ฉันขอโทษที่คุณพูดถูก มันเป็นสิ่งที่ไม่ดีของฉัน จริงๆแล้วฉันเพิ่งตอบคำถามคนอื่น stackoverflow.com/questions/28349678/ แต่ตระหนักว่าคำตอบของฉันจะสร้างปัญหาใหม่ที่ฉันพูดถึงที่นี่และเริ่มสงสัย เนื่องจากฉันไม่ได้จัดการกับ XSL บ่อยนัก ฉันจึงต้องการเดินทางให้เสร็จสิ้น ดังนั้นฉันจึงอยากทราบความคิดเห็นของคุณเกี่ยวกับ คุณคิดสิ่งใดที่อาจทำให้เกิดปัญหาในเรื่องนั้นหรือไม่? (นอกเหนือจากแอตทริบิวต์ที่ขาดหายไป) ขอขอบคุณอีกครั้ง - person cilerler; 06.02.2015
comment
พบคำตอบของฉันได้ที่ stackoverflow.com/questions/12465002/ ขอบคุณอีกครั้ง! - person cilerler; 06.02.2015