2012-02-21 12 views
13

Tôi có xslt sau để chuyển đổi dữ liệu thành định dạng được chấp nhận bởi JQuery. Tuy nhiên, do JSON không chấp nhận dấu ngoặc kép trong chuỗi dữ liệu, tôi cần phải thay thế "với một dãy thoát \"XSLT + Thay thế dấu nháy kép bằng chuỗi thoát

XML:

<?xml version="1.0" encoding="UTF-8"?> 
<Rowsets> 
    <Rowset> 
     <Columns> 
      <Column Description="Element_1" SQLDataType="12" /> 
      <Column Description="Element_2" SQLDataType="12" /> 
      <Column Description="Element_3" SQLDataType="93" /> 
     </Columns> 
     <Row> 
      <Element_1>test_data</Element_1> 
      <Element_2>test_quo"te</Element_2> 
      <Element_3>test_data</Element_3> 
     </Row> 
    </Rowset> 
</Rowsets> 

XSLT hiện tại:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:java="http://xml.apache.org/xslt/java" exclude-result-prefixes="java"> 
    <xsl:output method="text" media-type="text/csv" encoding="UTF-8"/> 
    <xsl:param name="RowDelim">],</xsl:param> 
    <xsl:param name="RowLast">]</xsl:param> 
    <xsl:param name="RowStart">[</xsl:param> 
    <xsl:param name="startBracket">{ </xsl:param> 
    <xsl:param name="JQTableData">"aaData": [</xsl:param> 
    <xsl:param name="JQTableEnd">] }</xsl:param> 
    <xsl:param name="FieldDelim">,</xsl:param> 
    <xsl:param name="StringDelim">"</xsl:param> 
    <xsl:param name="DateFormat">yyyy-MM-dd HH:mm:ss</xsl:param> 


    <xsl:template match="/"> 





     <xsl:for-each select="Rowsets"> 

      <xsl:for-each select="Rowset"> 
      <xsl:value-of select="$startBracket"/> 
      <xsl:value-of select="$JQTableData"/> 
       <xsl:variable name="CurrentColumns" select="Columns"/> 
       <xsl:for-each select="Columns"> 
        <xsl:for-each select="Column"> 

         <xsl:if test="not(position() = last())"> 

         </xsl:if> 
        </xsl:for-each> 

       </xsl:for-each> 
       <xsl:for-each select="Row"> 
       <xsl:value-of select="$RowStart"/> 
        <xsl:for-each select="*"> 
         <xsl:variable name="ColName"> 
          <xsl:value-of select="name(.)"/> 
         </xsl:variable> 
         <xsl:variable name="ColType"> 
          <xsl:value-of select="$CurrentColumns/Column[@Name=$ColName]/@SQLDataType"/> 
         </xsl:variable> 
         <xsl:choose> 
          <xsl:when test="$ColType= '2' or $ColType= '3' or $ColType= '4' or $ColType= '5' or 

$ColType= '6' or $ColType= '7' or $ColType= '8' or $ColType= '-7'"> 
           <xsl:value-of select="."/> 
          </xsl:when> 
          <xsl:otherwise> 
           <xsl:value-of select="$StringDelim"/> 
           <xsl:choose> 
            <xsl:when test="$ColType= '91' or $ColType= '92' or $ColType= '93'"> 
             <xsl:choose> 
              <xsl:when test=". = 'TimeUnavailable'"> 
               <xsl:value-of select="."/> 
              </xsl:when> 
              <xsl:otherwise> 
                         </xsl:otherwise> 
             </xsl:choose> 
            </xsl:when> 
            <xsl:otherwise> 
            <xsl:choose> 
             <xsl:when test=". = 'true'"> 
              <xsl:text>Y</xsl:text> 
             </xsl:when> 
             <xsl:when test=". = 'false'"> 
              <xsl:text>N</xsl:text> 
             </xsl:when> 
             <xsl:otherwise> 
              <xsl:value-of select="."/> 
             </xsl:otherwise> 
             </xsl:choose> 
            </xsl:otherwise> 
           </xsl:choose> 
           <xsl:value-of select="$StringDelim"/> 
          </xsl:otherwise> 
         </xsl:choose> 
         <xsl:if test="not(position() = last())"> 
          <xsl:value-of select="$FieldDelim"/> 
         </xsl:if> 
        </xsl:for-each> 
          <xsl:if test="not(position() = last())"> 
          <xsl:value-of select="$RowDelim"/> 
         </xsl:if> 
          <xsl:if test="position() = last()"> 
          <xsl:value-of select="$RowLast"/> 
         </xsl:if> 

       </xsl:for-each> 
       <xsl:value-of select="$JQTableEnd"/> 
      </xsl:for-each> 
     </xsl:for-each> 
    </xsl:template> 



</xsl:stylesheet> 

Sản lượng hiện tại:

{ "aaData": [["test_data","test_quo"te","test_data"]] } 

đầu ra mong muốn:

{ "aaData": [["test_data","test_quo\"te","test_data"]] } 
+0

user1130511: Không phải ký tự thoát '\' (dấu gạch chéo ngược)? –

+0

user1130511: Mã XSLT được cung cấp không được định dạng tốt - không ai có thể làm việc với nó ngay bây giờ. Vui lòng chỉnh sửa câu hỏi và sửa. –

+0

@DimitreNovatchev woops, sao chép phiên bản sai. Tôi đã cập nhật XSLT, điều đó sẽ hoạt động. Và vâng, nó phải là dấu gạch chéo ngược – user1130511

Trả lời

26

Thêm mẫu này để mã của bạn:

<xsl:template name="escapeQuote"> 
     <xsl:param name="pText" select="."/> 

     <xsl:if test="string-length($pText) >0"> 
     <xsl:value-of select= 
     "substring-before(concat($pText, '&quot;'), '&quot;')"/> 

     <xsl:if test="contains($pText, '&quot;')"> 
     <xsl:text>\"</xsl:text> 

     <xsl:call-template name="escapeQuote"> 
      <xsl:with-param name="pText" select= 
      "substring-after($pText, '&quot;')"/> 
     </xsl:call-template> 
     </xsl:if> 
     </xsl:if> 
    </xsl:template> 

Sau đó thay đổi:

<xsl:value-of select="."/> 

-:

<xsl:call-template name="escapeQuote"/> 

chuyển đổi hoàn toàn của bạn bây giờ trở thành:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:java="http://xml.apache.org/xslt/java" exclude-result-prefixes="java"> 
     <xsl:output method="text" media-type="text/csv" encoding="UTF-8"/> 
     <xsl:param name="RowDelim">],</xsl:param> 
     <xsl:param name="RowLast">]</xsl:param> 
     <xsl:param name="RowStart">[</xsl:param> 
     <xsl:param name="startBracket">{ </xsl:param> 
     <xsl:param name="JQTableData">"aaData": [</xsl:param> 
     <xsl:param name="JQTableEnd">] }</xsl:param> 
     <xsl:param name="FieldDelim">,</xsl:param> 
     <xsl:param name="StringDelim">"</xsl:param> 
     <xsl:param name="DateFormat">yyyy-MM-dd HH:mm:ss</xsl:param> 


     <xsl:template match="/"> 

      <xsl:for-each select="Rowsets"> 

       <xsl:for-each select="Rowset"> 
       <xsl:value-of select="$startBracket"/> 
       <xsl:value-of select="$JQTableData"/> 
        <xsl:variable name="CurrentColumns" select="Columns"/> 
        <xsl:for-each select="Columns"> 
         <xsl:for-each select="Column"> 

          <xsl:if test="not(position() = last())"> 

          </xsl:if> 
         </xsl:for-each> 

        </xsl:for-each> 
        <xsl:for-each select="Row"> 
        <xsl:value-of select="$RowStart"/> 
         <xsl:for-each select="*"> 
          <xsl:variable name="ColName"> 
           <xsl:value-of select="name(.)"/> 
          </xsl:variable> 
          <xsl:variable name="ColType"> 
           <xsl:value-of select="$CurrentColumns/Column[@Name=$ColName]/@SQLDataType"/> 
          </xsl:variable> 
          <xsl:choose> 
           <xsl:when test="$ColType= '2' or $ColType= '3' or $ColType= '4' or $ColType= '5' or 

    $ColType= '6' or $ColType= '7' or $ColType= '8' or $ColType= '-7'"> 
            <xsl:value-of select="."/> 
           </xsl:when> 
           <xsl:otherwise> 
            <xsl:value-of select="$StringDelim"/> 
            <xsl:choose> 
             <xsl:when test="$ColType= '91' or $ColType= '92' or $ColType= '93'"> 
              <xsl:choose> 
               <xsl:when test=". = 'TimeUnavailable'"> 
                <xsl:value-of select="."/> 
               </xsl:when> 
               <xsl:otherwise> 
                          </xsl:otherwise> 
              </xsl:choose> 
             </xsl:when> 
             <xsl:otherwise> 
             <xsl:choose> 
              <xsl:when test=". = 'true'"> 
               <xsl:text>Y</xsl:text> 
              </xsl:when> 
              <xsl:when test=". = 'false'"> 
               <xsl:text>N</xsl:text> 
              </xsl:when> 
              <xsl:otherwise> 
               <xsl:call-template name="escapeQuote"/> 
               <!-- <xsl:value-of select="."/> --> 
              </xsl:otherwise> 
              </xsl:choose> 
             </xsl:otherwise> 
            </xsl:choose> 
            <xsl:value-of select="$StringDelim"/> 
           </xsl:otherwise> 
          </xsl:choose> 
          <xsl:if test="not(position() = last())"> 
           <xsl:value-of select="$FieldDelim"/> 
          </xsl:if> 
         </xsl:for-each> 
           <xsl:if test="not(position() = last())"> 
           <xsl:value-of select="$RowDelim"/> 
          </xsl:if> 
           <xsl:if test="position() = last()"> 
           <xsl:value-of select="$RowLast"/> 
          </xsl:if> 

        </xsl:for-each> 
        <xsl:value-of select="$JQTableEnd"/> 
       </xsl:for-each> 
      </xsl:for-each> 
     </xsl:template> 

     <xsl:template name="escapeQuote"> 
      <xsl:param name="pText" select="."/> 

      <xsl:if test="string-length($pText) >0"> 
      <xsl:value-of select= 
      "substring-before(concat($pText, '&quot;'), '&quot;')"/> 

      <xsl:if test="contains($pText, '&quot;')"> 
      <xsl:text>\"</xsl:text> 

      <xsl:call-template name="escapeQuote"> 
       <xsl:with-param name="pText" select= 
       "substring-after($pText, '&quot;')"/> 
      </xsl:call-template> 
      </xsl:if> 
      </xsl:if> 
     </xsl:template> 

</xsl:stylesheet> 

khi chuyển đổi này được áp dụng trên các tài liệu XML cung cấp:

<Rowsets> 
    <Rowset> 
     <Columns> 
      <Column Description="Element_1" SQLDataType="12" /> 
      <Column Description="Element_2" SQLDataType="12" /> 
      <Column Description="Element_3" SQLDataType="93" /> 
     </Columns> 
     <Row> 
      <Element_1>test_data</Element_1> 
      <Element_2>test_quo"te</Element_2> 
      <Element_3>test_data</Element_3> 
     </Row> 
    </Rowset> 
</Rowsets> 

các truy nã, kết quả chính xác được sản xuất:

{ "aaData": [["test_data","test_quo\"te","test_data"]] } 
+0

Xin lỗi, tôi mới tương đối với XSLT. Có khả năng tự động áp dụng mẫu này cho tất cả các giá trị của, cho phép nói "body/row" bằng cách thêm một số thuộc tính? –

+1

@JamesCazzetta, một mẫu có tên cần phải được gọi. Tôi thực sự khuyên bạn nên tham gia khóa đào tạo XSLT, chẳng hạn như: http://www.pluralsight.com/courses/xslt-foundations-part1 –