Используйте весь текст внутри тегов <title>для группы HTML-файлов в одной папке - PullRequest
0 голосов

В настоящее время я использую этот код: (Linux Bash)

for x in *.html; do sed -i "a/(sudo grep -o '<title>.*</title>' $x)(sudo grep -o '<title>.*</title>' | sudo sed "s/\b[a-z]/\u&/g")//g" $x; echo moving $x; done

и, похоже, он не будет работать, кто-нибудь может мне помочь, нужно ли мне продолжать использовать (sed) или попробуйте использовать другие плагины?

INTRO:

У меня примерно тысяча html-файлов. Все они имеют теги внутри, нотекст между тегами в нижнем регистре,

Я хочу использовать заглавные буквы для каждого слова между тегами и сделать все сразу, используя цикл в команде bash.

ПРИМЕР:

<title>sample title</title> 

TO >>>

<title>Sample Title</title>

1 Ответ

0 голосов
/ 11 мая 2018

Вы можете использовать следующую таблицу стилей XSLT для решения вашей проблемы:

ВХОДНЫЕ ФАЙЛЫ:

$ more ?.html
::::::::::::::
1.html
::::::::::::::
<!DOCTYPE html>
<html>

<head>
  <title>title reference 1.html</title>
</head>

<body>
The content of the document......
</body>

</html>
::::::::::::::
2.html
::::::::::::::
<!DOCTYPE html>
<html>

<head>
  <title>title reference 2.html</title>
</head>

<body>
The content of the document......
</body>

</html>

STYLESHEET:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:redirect="http://xml.apache.org/xalan/redirect" extension-element-prefixes="redirect" xmlns:xalan="http://xml.apache.org/xslt" exclude-result-prefixes="xalan redirect ">
<xsl:output method="html" indent="yes" xalan:indent-amount="4" include-content-type="false" omit-xml-declaration="yes"/>
<xsl:strip-space elements="*" />

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


<xsl:template name="TitleCase">
  <xsl:param name="text"/>
  <xsl:choose>
    <xsl:when test="contains($text,' ')">
      <xsl:call-template name="TitleCaseWord">
        <xsl:with-param name="text" select="substring-before($text,' ')"/>
      </xsl:call-template>
      <xsl:text> </xsl:text>
      <xsl:call-template name="TitleCase">
        <xsl:with-param name="text" select="substring-after($text,' ')"/>
      </xsl:call-template>
    </xsl:when>
    <xsl:otherwise>
      <xsl:call-template name="TitleCaseWord">
        <xsl:with-param name="text" select="$text"/>
      </xsl:call-template>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

<xsl:template name="TitleCaseWord">
  <xsl:param name="text"/>
  <xsl:value-of select="translate(substring($text,1,1),'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ')" /><xsl:value-of select="substring($text,2,string-length($text)-1)" />
</xsl:template>


    <xsl:template match="//*[local-name()='title']">
        <title>
        <xsl:call-template name="TitleCase">
                <xsl:with-param name="text" select="."/>
        </xsl:call-template>
        </title>
    </xsl:template>
</xsl:stylesheet>

CMD:

$ for i in *.html; do java -classpath "./tagsoup-1.2.jar:./saxon9he.jar" net.sf.saxon.Transform --suppressXsltNamespaceCheck:on -x:org.ccil.cowan.tagsoup.Parser -s:1.html -xsl:title_upper.xsl -o:"new_${i}"; done 

Вы можете скачать 2 баночки на

https://mvnrepository.com/artifact/org.ccil.cowan.tagsoup/tagsoup/1.2

и http://saxon.sourceforge.net/

ВЫВОД:

$ more new_*
::::::::::::::
new_1.html
::::::::::::::
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:html="http://www.w3.org/1999/xhtml">
   <head>
      <title xmlns="">Title Reference 1.html</title>
   </head>
   <body>
      The content of the document......

   </body>
</html>
::::::::::::::
new_2.html
::::::::::::::
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:html="http://www.w3.org/1999/xhtml">
   <head>
      <title xmlns="">Title Reference 1.html</title>
   </head>
   <body>
      The content of the document......

   </body>
</html>

Если у вас есть проблема с saxon, вы можете просто использовать xsltproc, поскольку я использую таблицу стилей 1.0 версии:

for i in *.html; do xsltproc --html title_upper.xsl ${i} > "new_${i}"; done

stylesheet

command exec

...