2011-02-13 2 views
0

хорошо, у меня есть таблицы стилей XSLT, что делает большинство из того, что мне нужно сейчас, это выглядит так:XSLT, захватить только часть строки внутри тега

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:template match="//Product/Description"> 
    <title> 
     <xsl:apply-templates/> 
    </title> 
    </xsl:template> 
    <xsl:template match="//Product/Picture"> 
    <link> 
     <xsl:apply-templates/> 
    </link> 
    </xsl:template> 
    <xsl:template match="//Product/Caption"> 
    <description> 
     <xsl:apply-templates/> 
    </description> 
    </xsl:template> 
    <xsl:template match="Picture"> 
    <xsl:param name="text"/> 
    <xsl:choose> 
     <xsl:when test="contains($text, '&lt;')"> 
     <xsl:value-of select="substring-before($text, '&lt;')"/> 
     <xsl:call-template name="strip-tags"> 
      <xsl:with-param name="text" select="substring-after($text, 'src=')"/> 
     </xsl:call-template> 
     </xsl:when> 
     <xsl:otherwise> 
     <xsl:value-of select="$text"/> 
     </xsl:otherwise> 
    </xsl:choose> 
    <xsl:apply-templates/> 
    </xsl:template> 
    <xsl:template match="Caption"> 
    <xsl:param name="text"/> 
    <xsl:choose> 
     <xsl:when test="contains($text, '&lt;')"> 
     <xsl:value-of select="substring-before($text, '&lt;')"/> 
     <xsl:call-template name="strip-tags"> 
      <xsl:with-param name="text" select="substring-after($text,'&gt;')"/> 
     </xsl:call-template> 
     </xsl:when> 
     <xsl:otherwise> 
     <xsl:value-of select="$text"/> 
     </xsl:otherwise> 
    </xsl:choose> 
    <xsl:apply-templates/> 
    </xsl:template> 
</xsl:stylesheet> 

это, вероятно, огромный ляп, потому что Я просто хватаю текст из «сырого» вывода моего редактора xml, потому что он делает то, что мне нужно. он помещает правильные метки в нужные места. однако теперь «strip-tag», похоже, не работает, и я попытался сделать еще одну версию «strip-tag», которая разделила бы все, что указано далее: «src =» и «предыдущий»>, но, очевидно, «strip-tag» быть противоположным тому, что я пытаюсь сделать. есть ли что-то противоположное «strip-tag»? то я мог бы просто заменить слово «стрип-тегов» с «стрип-все кроме» или то, что можно было бы назвать

EDIT:
здесь является входной файл XML:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE StoreExport SYSTEM "http://store.yahoo.com/doc/dtd/StoreExport.dtd"> 
<StoreExport> 
    <Settings> 
    <Published timestamp="1297187196"/> 
    <Locale code="C" name="English" encoding="iso-8859-1"/> 
    <StoreName>Cl33333</StoreName> 
    <Currency>USD</Currency> 
    <ShipMethods> 
     <ShipMethod></ShipMethod> 

    </ShipMethods> 
    <PayMethods> 

    </PayMethods> 
    </Settings> 
    <Products> 

<Product Id="agfasu"> 
    <Code>3616a</Code> 
    <Description>Ageless Fashion Suit</Description> 
    <Url>http://www.cl333333333d.com/agfasu.html</Url> 
    <Thumb>&lt;img border=0 width=50 height=70 src=http://ep.y3333333333327706119506618_2144_317652924&gt;</Thumb> 
    <Picture>&lt;img border=0 width=600 height=845 src=http://ep.yim3333333st-27706119506618_2144_317019111&gt;</Picture> 

    <Orderable>YES</Orderable> 
    <Taxable>YES</Taxable> 
    <Pricing> 
    <BasePrice>178.00</BasePrice> 

    </Pricing> 
    <Path>333333333333333om/wochsu.html">Womens Church Suits</ProductRef> 
    <ProductRef Id="2454" Url="http://www.cl33333333454.html">Aussie Austine Spring/Summer 2011</ProductRef> 

    </Path> 
    <Availability>Usually ships the next business day.</Availability> 
    <Caption>&lt;head&gt; &lt;meta content="en-us" http-equiv="Content-Language"&gt; &lt;style type="text/css"&gt; .style3 { font-family: arial, helvetica; font-size: medium; font-weight: bold; } .style4 { font-size: small; } &lt;/style&gt; &lt;/head&gt; &lt;p&gt;&lt;strong&gt;Wholesale Women&amp;#39;s</Caption> 

    <OptionLists> 
    <OptionList name="Size"> 
     <OptionValue>8</OptionValue> 
    </OptionList> 
    <OptionList name="Colors"> 
     <OptionValue>Red</OptionValue> 
    </OptionList> 

    <OptionList name="Accessories"> 
     <OptionValue>Suit</OptionValue> 
    </OptionList> 

    </OptionLists> 
</Product> 

выход я хотел бы:

<item> 
<title> 
<![CDATA['DescriptionTag]]> 
</title> 
<description> 
<![CDATA[CaptionTagStrippedofEscapedCharacters]]> 
</description> 
<link>'UrlTag'</link> 
<g:condition>new</g:condition> 
<g:price>'BasePriceTag'</g:price> 
<g:product_type>Clothing, Accessories</g:product_type> 
<g:image_link>'PictureTagFrom 'src=' to '>' </g:image_link> 
<g:payment_accepted>Visa</g:payment_accepted> 
<g:payment_accepted>Mastercard</g:payment_accepted> 
<g:payment_accepted>Discover</g:payment_accepted> 
</item> 

некоторые теги не нужно быть заселена из источника, но всегда такой же, как «платеж принят», «условие», и «тип продукта»

+1

Было бы здорово, если бы вы добавили исходный XML и то, что вы хотите выполнить, то есть желаемый результат. –

+0

@Paulo: когда я сделал это, у людей сложилось впечатление, что вопрос слишком общий, и мне нужно более фундаментальное понимание проблемы. поэтому я решаю общую проблему с этим kludge. xml-файл: <Описание /> с несколькими другими неиспользованными тегами в элементе продукта. поэтому то, что приведенный выше лист делает для меня, переименовывает «теги» для каждого элемента, затем я копирую/вставляю и добавляю соответствующие заголовки файлов. элемент 'picture' имеет текст внутри тега, который мне не нужен, поэтому я просто хочу иметь тег вокруг того, что после src = before '>' – fightermagethief

+0

@bboyreason: проработайте очень простой пример ввода XML и желаемого вывода и добавьте тех, кто на ваш пост. Без этого никто не собирается пробираться через ваш XSLT и попытаться угадать, что вы хотите сделать. –

ответ

0

Не следует использовать XML-словарь, ни XML потребитель, который ожидает распознаваемы данных в виде текстового узла неанализируемых

Если вы это сделаете, то вы должны столкнуться последствиями и сделать правильный разбор вместо некоторых ошибок, склонной RegExp или строк обработки.

Очень основной XSLT анализатор для кодирования правильно wellformed XHTML находится на https://bug98168.bugzilla.mozilla.org/attachment.cgi?id=434081

Итак, можно разобрать ваши неразобранные данные, а затем нанести второй фазовое превращение с node-set() функции расширения.

+0

@Alejandro: В своем комментарии к OP я точно предупреждал о таких «решениях». Попробуйте вызвать шаблон d-o-e в этом XML-документе и посмотреть, какой неправильный результат он производит: ' Это образец текста. Знаки < и > сбежали. ' –

+0

@Alejandro: cool, я не вижу никаких экранированных символов на выходе. теперь я проверю этот «node-set()» – fightermagethief

+0

@Dimitre: Да, этот парсер работает только для правильно сформированного XHTML. Редактирование. Кстати, мы не должны поощрять людей с неправильным кодированным вариантом использования механизма DOE. –

Смежные вопросы