2016-11-10 22 views
1

背景

次のXMLコンテンツから要素を抽出するために探している相手:削除、名前空間

<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
       xmlns:h="http://java.sun.com/jsf/html" 
       xmlns:f="http://java.sun.com/jsf/core" 
       xmlns:ui="http://java.sun.com/jsf/facelets"> 
    <h:inputText id="id"/> 
    ... 
</ui:composition> 

抽出

すべてh:inputText要素を使用して選択することができます。

xmlstarlet sel -t -c "//h:inputText" filename.xml 

問題

これは、次の名前空間が出没する出力生成:名前空間は出力を抑制することができますどのように質問

<h:inputText 
    xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:ui="http://java.sun.com/jsf/facelets" id="id"/> 

を?

アイデア

後処理には正規表現を使用します。ただし、

  • sedには貪欲でない一致がありません。
  • perlはあまりにも重すぎます(複雑な正規表現が必要です)。

2回目のパスでxmllintまたはxmlstarletをパイプしますが、整形式のXML文書が必要です。

xmllintを使用すると、独自の名前空間の問題が発生します。

のみui:compositionh:inputText要素から構成される文書を作成:

<ui:composition 
    xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:ui="http://java.sun.com/jsf/facelets"> 
    <h:inputText id="id"/> 
    <h:inputText id="id"/> 
</ui:composition> 

h:inputText要素は文書の任意の深さで行うことができるので、これは厄介です。

答えて

1

XSLTを使用できます。 h:inputTextをそのまま出力したい場合は、プレフィックスh:をurl http://java.sun.com/jsf/htmlにバインドする名前空間宣言を抑制することはできません。

XSLT 1.0

input.xslを作成します。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:h="http://java.sun.com/jsf/html"> 
    <xsl:output omit-xml-declaration="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="/"> 
    <xsl:apply-templates select="//h:inputText"/> 
    </xsl:template> 

    <xsl:template match="h:inputText"> 
    <xsl:copy> 
     <xsl:copy-of select="@*"/> 
    </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

xmlstarletコマンド

xmlstarlet tr input.xsl filename.xml 

出力

<h:inputText xmlns:h="http://java.sun.com/jsf/html" id="id"/> 

あなたは可能性があり、出力しかし、名前空間のない0 ...

XSLT 1。上記と同じコマンドラインを使用して0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:h="http://java.sun.com/jsf/html" exclude-result-prefixes="h"> 
    <xsl:output omit-xml-declaration="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="/"> 
    <xsl:apply-templates select="//h:inputText"/> 
    </xsl:template> 

    <xsl:template match="h:inputText"> 
    <inputText> 
     <xsl:copy-of select="@*"/> 
    </inputText> 
    </xsl:template> 

</xsl:stylesheet> 

出力

<inputText id="id"/> 

注:明示的に改行を追加し</xsl:copy>(または第二の例では</inputText>)後<xsl:text>&#xA;</xsl:text>を追加する必要があります。それ以外の場合、xmlstartletはすべての要素を1行に出力することがあります。 JSFが関与しているのでが

、考える(それは助けにはならなかったxmlstarlet 1.6.1とxsl:outputindent="yes"を使用して私のためでした。)

JSF出力:

<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:h="http://java.sun.com/jsf/html" 
       xmlns:f="http://java.sun.com/jsf/core" 
       xmlns:c="http://java.sun.com/jsp/jstl/core" 
       xmlns:ui="http://java.sun.com/jsf/facelets" 
       xmlns:a4j="http://richfaces.org/a4j" 
       exclude-result-prefixes="h f c ui a4j"> 
    <xsl:output method="xml" omit-xml-declaration="yes" /> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="/"> 
     <h:html> 
      <xsl:apply-templates select="//h:inputText"/> 
     </h:html> 
     <xsl:text>&#xA;</xsl:text> 
    </xsl:template> 

    <xsl:template match="h:inputText"> 
     <xsl:text>&#xA;</xsl:text> 
     <h:inputText> 
      <xsl:copy-of select="@*"/> 
     </h:inputText> 
     <xsl:text>&#xA;</xsl:text> 
    </xsl:template> 
</xsl:stylesheet> 

+0

行う必要がありますどのようなJSFわかりませんあなたの編集があなたを助けたら、私は元に戻っていません。 –