XSLT форматирование ввода HTML - PullRequest
2 голосов
/ 28 марта 2012

Я хочу использовать XSLT для удаления атрибутов из файла HTML.Файл HTML выглядит следующим образом:

<html>
    <head>
        <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
        <title>CB Comfy Bike</title>
        <meta name="atg:string,index:$repositoryId" content="prod10005" />
        <meta name="atg:date:creationDate" content="955050507" />
        <meta name="atg:date:startDate" content="978325200" />
        <meta name="atg:date:endDate" content="1009861200" />
        <meta name="atg:string:$url"
            content="atgrep:/ProductCatalog/frame-product/prod10005?locale=en_US" />
        <meta name="atg:string,index:$baseUrl"
            content="atgrep:/ProductCatalog/frame-product/prod10005" />
        <meta name="atg:string:$repository.repositoryName" content="ProductCatalog" />
        <meta name="atg:string:$itemDescriptor.itemDescriptorName" content="frame-product" />
        <meta name="atg:string:childSKUs.$repositoryId" content="sku20007" />
        <meta name="atg:string:childSKUs.$itemDescriptor.itemDescriptorName" content="bike-sku" />
        <meta name="atg:date:childSKUs.creationDate" content="955068027" />
        <meta name="atg:float:childSKUs.listPrice" content="400.0" />
        <meta name="atg:float:childSKUs.salePrice" content="300.0" />
        <meta name="atg:boolean:childSKUs.onSale" content="false" />
        <meta name="atg:string:parentCategory.$repositoryId" content="cat55551" />
        <meta name="atg:date:parentCategory.creationDate" content="956950321" />
        <meta name="atg:string,docset:ancestorCategories.$repositoryId" content="cat10002" />
        <meta name="atg:string,docset:ancestorCategories.$repositoryId" content="cat10003" />
        <meta name="atg:string,docset:ancestorCategories.$repositoryId" content="cat55551" />
    </head>
    <body>
        <div class="atg:role:displayName" id="0"> CB Comfy Bike </div>
        <div class="atg:role:longDescription" id="1"> This bike is just right, whether you are a
            commuter or want to explore the fire roads. The plush front suspension will smooth out
            the roughest bumps and the big disc brakes provide extra stopping power for those big
            downhills. </div>
        <div class="atg:role:keywords" id="2"> mountain_bike comfort_bike </div>
        <div class="atg:role:childSKUs.displayName" id="3"> CB Comfy Bike Medium </div>
        <div class="atg:role:childSKUs.listPrice" id="4"> 400.0 </div>
        <div class="atg:role:childSKUs.description" id="5"> Medium </div>
        <div class="atg:role:parentCategory.displayName" id="6"> Mountain Bikes </div>
    </body>
</html>

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

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
    <xsl:output method="xml" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="head"/>

    <xsl:template match="body">
        <xsl:copy>
            <xsl:value-of select="div/text()"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

, который возвращает:

<?xml version="1.0" encoding="utf-8"?>
<html>
    <body> CB Comfy Bike </body>
</html>

Как мне превратить вход в нечто подобное

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <tag1>CB Comfy Bike</tag1>
    <tag2>This bike is just right, whether you are a
        commuter or want to explore the fire roads. The plush front suspension will smooth out
        the roughest bumps and the big disc brakes provide extra stopping power for those big
        downhills.</tag2>
    <tag3>mountain_bike comfort_bike</tag3>
    <tag4>CB Comfy Bike Medium</tag4>
    <tag5>400.0</tag5>
    <tag6>Medium</tag6>
    <tag7>Mountain Bikes</tag7>
</root>

Проблема в том, что я различаю теги Div.

Ответы [ 3 ]

0 голосов
/ 28 марта 2012

Я бы сделал что-то похожее на Тимура, но я бы не использовал for-each. Я бы использовал шаблон для перебора элементов div внутри тела

Применение следующего к предоставленному XML

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="html">
        <xsl:apply-templates select="body"/>
    </xsl:template>

    <xsl:template match="body">
        <root>
            <xsl:apply-templates select="div"/>
        </root>
    </xsl:template>

    <xsl:template match="div">
        <xsl:element name="{concat('tag', position())}">
            <xsl:value-of select="."/>
        </xsl:element>
    </xsl:template>

</xsl:stylesheet>

дает желаемый результат

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <tag1> CB Comfy Bike </tag1>
    <tag2> This bike is just right, whether you are a
        commuter or want to explore the fire roads. The plush front suspension will smooth out
        the roughest bumps and the big disc brakes provide extra stopping power for those big
        downhills. </tag2>
    <tag3> mountain_bike comfort_bike </tag3>
    <tag4> CB Comfy Bike Medium </tag4>
    <tag5> 400.0 </tag5>
    <tag6> Medium </tag6>
    <tag7> Mountain Bikes </tag7>
</root>

Использование:

  1. Идентификационное преобразование
  2. шаблон значения атрибута
  3. apply-templates для итерации по дочерним узлам
0 голосов
/ 29 марта 2012

Это короткое и простое преобразование :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/*">
  <root>
   <xsl:apply-templates select="body/div"/>
  </root>
 </xsl:template>

 <xsl:template match="div">
  <xsl:element name="tag{position()}">
   <xsl:value-of select="."/>
  </xsl:element>
 </xsl:template>
</xsl:stylesheet>

при применении к предоставленному документу XML :

<html>
        <head>
            <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
            <title>CB Comfy Bike</title>
            <meta name="atg:string,index:$repositoryId" content="prod10005" />
            <meta name="atg:date:creationDate" content="955050507" />
            <meta name="atg:date:startDate" content="978325200" />
            <meta name="atg:date:endDate" content="1009861200" />
            <meta name="atg:string:$url"
                content="atgrep:/ProductCatalog/frame-product/prod10005?locale=en_US" />
            <meta name="atg:string,index:$baseUrl"
                content="atgrep:/ProductCatalog/frame-product/prod10005" />
            <meta name="atg:string:$repository.repositoryName" content="ProductCatalog" />
            <meta name="atg:string:$itemDescriptor.itemDescriptorName" content="frame-product" />
            <meta name="atg:string:childSKUs.$repositoryId" content="sku20007" />
            <meta name="atg:string:childSKUs.$itemDescriptor.itemDescriptorName" content="bike-sku" />
            <meta name="atg:date:childSKUs.creationDate" content="955068027" />
            <meta name="atg:float:childSKUs.listPrice" content="400.0" />
            <meta name="atg:float:childSKUs.salePrice" content="300.0" />
            <meta name="atg:boolean:childSKUs.onSale" content="false" />
            <meta name="atg:string:parentCategory.$repositoryId" content="cat55551" />
            <meta name="atg:date:parentCategory.creationDate" content="956950321" />
            <meta name="atg:string,docset:ancestorCategories.$repositoryId" content="cat10002" />
            <meta name="atg:string,docset:ancestorCategories.$repositoryId" content="cat10003" />
            <meta name="atg:string,docset:ancestorCategories.$repositoryId" content="cat55551" />
        </head>
        <body>
            <div class="atg:role:displayName" id="0"> CB Comfy Bike </div>
            <div class="atg:role:longDescription" id="1"> This bike is just right, whether you are a
                commuter or want to explore the fire roads. The plush front suspension will smooth out
                the roughest bumps and the big disc brakes provide extra stopping power for those big
                downhills. </div>
            <div class="atg:role:keywords" id="2"> mountain_bike comfort_bike </div>
            <div class="atg:role:childSKUs.displayName" id="3"> CB Comfy Bike Medium </div>
            <div class="atg:role:childSKUs.listPrice" id="4"> 400.0 </div>
            <div class="atg:role:childSKUs.description" id="5"> Medium </div>
            <div class="atg:role:parentCategory.displayName" id="6"> Mountain Bikes </div>
        </body>
</html>

дает желаемый, правильный результат :

<root>
   <tag1> CB Comfy Bike </tag1>
   <tag2> This bike is just right, whether you are a
                commuter or want to explore the fire roads. The plush front suspension will smooth out
                the roughest bumps and the big disc brakes provide extra stopping power for those big
                downhills. </tag2>
   <tag3> mountain_bike comfort_bike </tag3>
   <tag4> CB Comfy Bike Medium </tag4>
   <tag5> 400.0 </tag5>
   <tag6> Medium </tag6>
   <tag7> Mountain Bikes </tag7>
</root>

Объяснение

  1. Надлежащее использование шаблонов.

  2. Использование функции position().

  3. Использование AVT (шаблоны значений атрибутов).

0 голосов
/ 28 марта 2012

Почти желаемый результат)

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
  <xsl:output method="xml" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="head"/>

  <xsl:template match="body">
    <xsl:for-each select="div">
      <xsl:element name="{concat('tag', position())}">
        <xsl:value-of select="./text()"/>
      </xsl:element>
    </xsl:for-each>
  </xsl:template>

</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...