2016-08-31 2 views
0

У меня есть XML и XSL вроде этого:Получить HTML содержимое в виде строки с помощью XSLT

XML

<definitions> 
    <process id="Process_1"> 
    <Task id="Task_1yh7nak" name="Add"> 
     <Steps> 
     <Step id="Step_1" Order="1"> 
      <Form> 
      <form-template> 
       <fields> 
       <field type="text" label="start" id="text-14708410685"></field> 
       <field type="text" label="end" id="text-5651568987"></field> 
       <field type="button" subtype="button" label="Button" id="button-1470841070721"></field> 
       </fields> 
      </form-template> 
      </Form> 
     </Step>   
     </Steps> 
    </Task> 
    </process> 
</definitions> 

XSL

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"        
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
           xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xsl:output method = "text" omit-xml-declaration = "no" indent = "no" encoding="Windows-1252"/> 

<!-- Start the code generation here. --> 
    <xsl:template match ="*"> 

    using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 
    using System.Xml.Linq; 
    using System.Windows.Forms; 

namespace Core 
{ 
    public static class DynamicCode 
    { 
    <xsl:for-each select="/definitions/process/Task"> 
    public static string <xsl:value-of select="@id"/>_GetStartForm() 
    { 
    string formContent = "<xsl:for-each select="Steps/Step[@Order='1']/Form/form-template/fields/field"> 
     <!--Switch Case for type of controls --> 
     <xsl:choose>   
     <xsl:when test="@type='text'"> 
      <h2> textbox </h2> 
      <input> 
      <xsl:attribute name="value"> 
       <xsl:value-of select="@label"/> 
      </xsl:attribute> 
      <xsl:attribute name="id"> 
       <xsl:value-of select="@id"/> 
      </xsl:attribute> 
      </input> 
      <br/> 
     </xsl:when> 

     <xsl:when test="@type='button'"> 
      <h2> button </h2> 
      <input type="button"> 
      <xsl:attribute name="value"> 
       <xsl:value-of select="@label"/> 
      </xsl:attribute> 
      <xsl:attribute name="id"> 
       <xsl:value-of select="@id"/> 
      </xsl:attribute> 
      </input> 
      <br/> 
     </xsl:when> 
     </xsl:choose> 

    </xsl:for-each>"; 
    return formContent; 
    } 
    </xsl:for-each> 
    } 
} 

</xsl:template> 
</xsl:stylesheet> 

Я преобразовать XML с этим XSL (XSLT 1.0).

Выход

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml.Linq; 
using System.Windows.Forms; 

namespace Core 
{ 
    public static class DynamicCode 
    { 

    public static string Task_1yh7nak_GetStartForm() 
    { 
    string formContent = " textbox textbox button "; 
    return formContent; 
    } 

    } 
} 

Интернет выход: http://xsltransform.net/pPJ8LUY/1

Я стараюсь, чтобы получить полное содержание HTML в fields тег в виде строки. Мне нужно это содержимое для заполнения Literal на веб-странице.

<h2> textbox </h2> 
<input id="text-14708410685" value="start"></input> 
<h2> textbox </h2> 
<input id="text-5651568987" value="end"></input> 
<h2> button </h2> 
<input type="button" id="button-1470841070721" value="submit"></input> 

Но на выходе, у меня есть только значение h2 тега.

string formContent = " textbox textbox button "; 

Было бы очень полезно, если бы кто-нибудь мог объяснить решение этой проблемы.

+1

Если вы хотите, чтобы такие элементы, как в 'input' элементов в то вам нужно использовать 'xsl: output method =" html "или' xml', используемый вами метод вывода текста должен выводить простой текст в текстовых узлах, но никакой разметки элемента не указывать эс. –

+0

@MartinHonnen thx, я этого не замечал. –

+0

@MartinHonnen Один вопрос, вывод должен быть классом C#, но атрибуты имеют '' '. В строке это делает ошибку. Я не могу использовать \ before и after them в' xsl: value-of'. –

ответ

1

Это не так приятно смотреть, но в XSLT 1.0 вам придется вручную удалить все теги HTML, которые вы хотите вывести.

Попробуйте XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"        
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
           xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xsl:output method = "text" omit-xml-declaration = "no" indent = "no" encoding="Windows-1252"/> 

<!-- Start the code generation here. --> 
    <xsl:template match ="*"> 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml.Linq; 
using System.Windows.Forms; 

namespace Core 
{ 
    public static class DynamicCode 
    { 
    <xsl:for-each select="/definitions/process/Task"> 
    public static string <xsl:value-of select="@id"/>_GetStartForm() 
    { 
    string formContent = "<xsl:for-each select="Steps/Step[@Order='1']/Form/form-template/fields/field"> 
     <!--Switch Case for type of controls --> 
     <xsl:choose>   
     <xsl:when test="@type='text'"> 
      <xsl:text>&lt;h2&gt;textbox&lt;/h2&gt;</xsl:text> 
      <xsl:text>&lt;input</xsl:text> 
     </xsl:when> 
     <xsl:when test="@type='button'"> 
      <xsl:text>&lt;h2&gt;button&lt;/h2&gt;</xsl:text> 
      <xsl:text>&lt;input type=\"button\"</xsl:text> 
     </xsl:when> 
     </xsl:choose> 
     <xsl:text> id=\"</xsl:text> 
     <xsl:value-of select="@id" /> 
     <xsl:text>\"</xsl:text> 
     <xsl:text> value=\"</xsl:text> 
     <xsl:value-of select="@label" /> 
     <xsl:text>\"</xsl:text> 
     <xsl:text>&gt;&lt;/input&gt;</xsl:text> 

    </xsl:for-each>"; 
    return formContent; 
    } 
    </xsl:for-each> 
    } 
} 

</xsl:template> 
</xsl:stylesheet> 

Это выводит соответствующую строку следующим образом:

string formContent = "<h2>textbox</h2><input id=\"text-14708410685\" value=\"start\"></input><h2>textbox</h2><input id=\"text-5651568987\" value=\"end\"></input><h2>button</h2><input type=\"button\" id=\"button-1470841070721\" value=\"Button\"></input>"; 

в действии на http://xsltransform.net/3NSSEuH