2017-08-02 3 views
2

おやすみ、XSLT 3を使用したテンプレートを使用して、parse-xml-fragmentの結果の未知の内容をどのように処理するのですか?

"parse-xml-fragment"の結果をXSL-T 3.0を使用してテンプレートに渡す際に問題があります。私はSaxon-PE 9.7.0.15(Javaバージョンは最新のoXygen 19にバンドルされています)を使用しています。あたかもそれが元のXML文書の一部であり、定義済み属性のbase64コンテンツではないかのように、 "parse-xml-fragment"から結果の "document-node"に(すでに)定義されたテンプレートを適用できるようにしたいと思います。言い換えれば、私は "parse-xml-fragment"の結果の未知の内容を調べる必要があります。

私は例えば

<xsl:value-of select="parse-xml-fragment(saxon:base64Binary-to-string(./@a, 'UTF-8'))/base64Root/a/@at"/> 

を使用してbase64のコンテンツから値を取得することができていますが、それは私が与えられた属性のBASE64値の構造と内容を知っていることを、想定し、私は知らないのです。

XMLファイルには、次のとおりです。(私が望むように動作しません)

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="a.xsl"?> 
<root a="PGJhc2U2NFJvb3Q+PGEgYXQ9IjEiPjwvYT48YiBhdD0iMiI+PC9iPjwvYmFzZTY0Um9vdD4="/> 
<!-- 
    content of @a is (and may vary in structure and content): 
    <base64Root><a at="1"></a><b at="2"></b></base64Root> 
--> 

XSL-T 3.0のファイルは次のとおりです。

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:saxon="http://saxon.sf.net/" exclude-result-prefixes="xs" version="3.0"> 

    <xsl:output method="text" /> 

    <xsl:template match="/root"> 
    <xsl:call-template name="anyElement"> 
     <xsl:with-param name="xmlFragment" select="parse-xml-fragment(saxon:base64Binary-to-string(./@a, 'UTF-8'))"/> 
    </xsl:call-template> 
    </xsl:template> 

    <xsl:template name="anyElement" match="*"> 
    <xsl:param name="xmlFragment"/> 
    <xsl:value-of select="local-name(.)"/> 
    <xsl:value-of select="./@at"/> 
    <xsl:apply-templates> 
     <xsl:with-param name="xmlFragment" select="."/> 
    </xsl:apply-templates> 
    </xsl:template> 

</xsl:stylesheet> 

所望の出力のようなものです(フォーマットは今重要ではありません) :

root 
PGJhc2U2NFJvb3Q+PGEgYXQ9IjEiPjwvYT48YiBhdD0iMiI+PC9iPjwvYmFzZTY0Um9vdD4= 
base64Root 
a 
1 
b 
2 

ご協力いただきありがとうございます。ステパン

答えて

3

私は単にあなたのテンプレートマッチング要素ノードへapply-templatesでノードを押すだろう、私はなぜあなたが最初のテンプレートを呼び出すことを確認していない:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:math="http://www.w3.org/2005/xpath-functions/math" 
    xmlns:saxon="http://saxon.sf.net/" 
    exclude-result-prefixes="xs math saxon" 
    version="3.0"> 

    <xsl:output method="text" /> 

    <xsl:template match="/root"> 
     <xsl:next-match/> 
     <xsl:apply-templates select="parse-xml-fragment(saxon:base64Binary-to-string(@a, 'UTF-8'))/node()"/> 
    </xsl:template> 

    <xsl:template match="*"> 
     <xsl:value-of select="local-name(), @*" separator="&#10;"/> 
     <xsl:text>&#10;</xsl:text> 
     <xsl:apply-templates/> 
    </xsl:template> 

</xsl:stylesheet> 

出力は、はい、偉大

root 
PGJhc2U2NFJvb3Q+PGEgYXQ9IjEiPjwvYT48YiBhdD0iMiI+PC9iPjwvYmFzZTY0Um9vdD4= 
base64Root 
a 
1 
b 
2 
+0

ですとてもシンプルに、それは動作します!どうもありがとうございました! –

関連する問題