XMLデータをHTMLに変換するときに、子ノードを失うことなく<P>タグでテキストを操作するのに役立つ -- html フィールド と xml フィールド と xslt フィールド と xpath フィールド 関連 問題

Need help manipulating text in a <p> tag without losing children nodes when transforming xml data to html












1
vote

問題

日本語

XSLT 2.0で変換されているXML文書を配布するためのHTML文書に変更しています。

問題が発生した問題は、HTMLにBRタグとして保存する必要があるPタグに存在するソフトラインブレーク(LF)がありますが、BRタグのLF文字を置き換えると、XREFタグが失われます。テキスト内。

サンプル.xml

<事前> <コード> <p>Section 1 <xref href="https://www.google.com/section1">Link</xref> Section 2 <xref href="https://www.google.com/section2">Link</xref> Section 3 <xref href="https://www.google.com/section3">Link</xref> </p>

これは出力

でこのようなものを見るべきです <事前> <コード> <p>Section 1 </br><xref href="https://www.google.com/section1">Link</xref><br/>Section 2 </br><xref href="https://www.google.com/section2">Link</xref><br/>Section 3 </br><xref href="https://www.google.com/section3">Link</xref><br/></p>

注:BRタグに変換されるハードコードLFSを説明するために上記をフォーマットしていません。

次の解決策を試しましたが、選択した文字列は既に子ノードを無視しています。

<事前> <コード> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xsl:output encoding="UTF-8"/> <xsl:template name="replace"> <xsl:param name="string"/> <xsl:choose> <xsl:when test="contains($string,'&#10;') "> <xsl:value-of select="substring-before($string,'&#10;')"/> <br/> <xsl:call-template name="replace"> <xsl:with-param name="string" select="substring-after($string,'&#10;')"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:if test="xref"> <xsl:copy-of select="xref"/> </xsl:if> <xsl:value-of select="$string"/> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template match="p"> <p> <xsl:call-template name="replace"> <xsl:with-param name="string" select="."/> </xsl:call-template> </p> </xsl:template> </xsl:stylesheet>

だから私は子供Xrefノードに影響を与えずにLFSをBRタグに置き換えるのに役立つ必要があります。

英語

I have an xml document that is being transformed with XSLT 2.0 to an HTML document for publication.

The issue I have is that there are soft line breaks (LF) that exist in the P tags that need to be preserved in the HTML as BR tags, but when I replace the LF characters for BR tags I lose any XREF tags within the text.

Sample .xml

<p>Section 1  <xref href="https://www.google.com/section1">Link</xref> Section 2 <xref href="https://www.google.com/section2">Link</xref> Section 3 <xref href="https://www.google.com/section3">Link</xref> </p> 

This should look something like this in the output

<p>Section 1 </br><xref href="https://www.google.com/section1">Link</xref><br/>Section 2 </br><xref href="https://www.google.com/section2">Link</xref><br/>Section 3 </br><xref href="https://www.google.com/section3">Link</xref><br/></p> 

NOTE: I haven't formatted the above to illustrate the hardcoded LFs that get converted into BR tags.

We tried the following solution, but the selected string already ignores the child node:

<xsl:stylesheet      version="2.0"      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"      xmlns:xs="http://www.w3.org/2001/XMLSchema">     <xsl:output encoding="UTF-8"/>     <xsl:template name="replace">         <xsl:param name="string"/>         <xsl:choose>             <xsl:when test="contains($string,'&#10;') ">                 <xsl:value-of select="substring-before($string,'&#10;')"/>                 <br/>                 <xsl:call-template name="replace">                     <xsl:with-param name="string" select="substring-after($string,'&#10;')"/>                 </xsl:call-template>             </xsl:when>             <xsl:otherwise>                 <xsl:if test="xref">                     <xsl:copy-of select="xref"/>                 </xsl:if>                 <xsl:value-of select="$string"/>             </xsl:otherwise>         </xsl:choose>     </xsl:template>     <xsl:template match="p">         <p>             <xsl:call-template name="replace">                 <xsl:with-param name="string" select="."/>             </xsl:call-template>         </p>     </xsl:template> </xsl:stylesheet> 

So simply I need help to replace LFs with BR tags without affecting child XREF nodes.

</div
           

回答リスト

0
 
vote
vote
ベストアンサー
 

あなたがXSLT 2を使用すると、 xsl:analyze-string を使用して、特定の要素によって文字を見つけて交換するというジョブが簡単になります。

現在のアプローチの問題については、<コード> <xsl:template match="p/text()"> または<コード> <xsl:template match="p//text()"> を書いてください(子孫での置き換えをしたい場合)、直接置き換えてください。テキストノードで、残りの場合は、ID変換を使用します。そのようにして、文書構造を保存し、 p 要素の子要素を削除しないでください。

<事前> <コード> <xsl:template match="p/text()"> <xsl:analyze-string select="." regex="&#10;"> <xsl:matching-substring> <br/> </xsl:matching-substring> <xsl:non-matching-substring> <xsl:value-of select="."/> </xsl:non-matching-substring> </xsl:analyze-string> </xsl:template>

https://xsltfiddle.liberty-development.net/6r5gh4d

Saxon 9.8以降のXSLT 3プロセッサがない場合は、

としてID変換を綴ってください。 <事前> <コード> <xsl:template match="@* | node()"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template>

xsl:mode 宣言をドロップします。

 

As you say you use XSLT 2 it seems using xsl:analyze-string would make the job of finding and replacing characters by certain elements easier.

As for the problem with your current approach, just write an <xsl:template match="p/text()"> or <xsl:template match="p//text()"> (if you want to do the replacement in descendants, too) and do any replacement directly in the text nodes, for the rest you use the identity transformation. That way you preserve the document structure and don't strip any child elements of the p elements.

  <xsl:template match="p/text()">       <xsl:analyze-string select="." regex="&#10;">           <xsl:matching-substring>               <br/>           </xsl:matching-substring>           <xsl:non-matching-substring>               <xsl:value-of select="."/>           </xsl:non-matching-substring>       </xsl:analyze-string>   </xsl:template> 

https://xsltfiddle.liberty-development.net/6r5Gh4d

If you don't have an XSLT 3 processor like Saxon 9.8 or later at your disposal spell out the identity transformation as

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

and drop the xsl:mode declaration used in the XSLT Fiddle example.

</div
 
 
 
 

関連する質問

18  特定のテキストを持つ要素を検索するXPathクエリ  ( Xpath query searching for an element with specific text ) 
以下のXML構造を考える <事前> <コード> <html> <body> <div> <span>Test: Text2</span> </div> <div> <span>Test: Text3</spa...

1  XPath 1.0からの関数を使用して関数matches()を実装する方法が必要です。  ( I need a way to implement the function matches from xpath 2 0 with functions f ) 
次のコードを持っています: root = "// valueexpression [一致(self :: *、 'pattern')] / .." しかし、私はXPath 1.0のみを使用でき、関数matches()の例外が表示されます。 XPath 1....

0  KlipFolio Klipを構築する。 JSONストリームですべての子ノードを数えるのですか?  ( Building a klipfolio klip how do i count all child nodes in a json stream ) 
Status = 'Active' JSONストリームを持つメンバーをカウントしたいと思います。これは私達のメンバーの合計に等しくなります。 @/name ですべてのメンバーを選択することができますが、アクティブな人だけをフィルタリングできません。 ...

3  タグなしテキストを識別するためのXPathクエリ  ( Xpath query to identify untagged text ) 
このHTMLを検討してください: <事前> <コード> <html> <head> </head> <body> <table> <tr> <td> <h1>title</h1> <h3>item...

1  XPath: "innerhtml"(<a href=""> innerhtml <span> excludeme </ span> </a>の "除外"タグ  ( Xpath exclude tag in innerhtml a href innerhtmlspanexcludeme span ) 
XPathを使用してHTMLサイトを照会しています。これまでのところきれいに機能しますが、今、私は(レンガ)壁を打ち、解決策を見つけることができません: - ) HTMLは次のようになります。 <事前> <コード> "test"1 "test"2 の...

1  JavaScriptでXPathを使用してXML文書全体を返すことができますか?  ( Can i return a whole xml document using xpath in javascript ) 
JavaScriptを使用していて、XML文書を返して欲しい結果を返します。 たとえば、XML文書は <コード> <books> <book> <title> Introduction to XML </title> </book> <book> <ti...

0  XPathはIDによってテーブルを見つけることができません  ( Xpath cant find a table by id ) 
WATIJを使用して画面削除をしていますが、HTMLテーブルを読み取ることはできません(NullPointerExceptionsまたはUnknownObjectExceptionsをスローします)。これを克服するために、私はHTMLを読み、JTIDYを通し...

147  XSLTが最後の要素を取得します  ( Xslt getting last element ) 
私は私のXMLの最後の要素を見つけようとしています。 <事前> <コード> <list> <element name="A" /> <element name="B" > <element nam...

2  XSLTを使用してパラメータのセットを指定してノードを見つける  ( Using xslt to find nodes given a set of parameters ) 
タイトルについてすみません - それを言葉する方法はわからなかった。 基本的に私はこのようなXMLを持っています: <事前> <コード> <countries> <country handle="bangladesh"/> <country h...

13  XPath 2.0を使用して数値シーケンスで重複した値をどのように識別しますか?  ( How do you identify duplicate values in a numerical sequence using xpath 2 0 ) 
私は私に以下のような一連の値を提供するXPath式を持っています: <コード> 1 2 2 3 4 5 5 6 7 distinct-values() を使用して、一意の値の一意の値を一意に変換するのが簡単です。ただし、抽出したいのは、重複した値= ...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有