0

我将样式表和输入流传递给Transformer类以获取输出 XML。

传递给 xmlns 的相对变量不会在结果中被替换。

输入流:

"http://www.abc.com/foo/bar"
+"EventCommon"
+"application,xsd:string"
+"companyId,xsd:string"
+"operator,xsd:string"
+"today,xsd:date"
+"transactionStage,xsd:string"

样式表:

<xsl:stylesheet 
  version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
>
  <xsl:output method="xml" encoding="UTF-8" indent="yes" />

  <xsl:template match="/">
    <xsl:variable name="var_main_namespace" select="array/data[@attribute=1][@value=1][@subvalue=1]" />
    <xsd:schema xmlns="($var_main_namespace)" targetNamespace="{$var_main_namespace}" elementFormDefault="qualified" />
  </xsl:template>
</xsl:stylesheet>

输出 XML:

<xsd:schema 
  xmlns="($var_main_namespace)" 
  xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
  targetNamespace="http://www.abc.com/foo/bar" 
  elementFormDefault="qualified"
/>

代码片段:

 TransformerFactory tFactory = TransformerFactory.newInstance();
 StreamSource sc = new StreamSource(new ByteArrayInputStream(new String(c).getBytes()));
 Transformer transformer = tFactory.newTransformer(sc);
 ByteArrayOutputStream outputxml = new ByteArrayOutputStream();
 transformer.transform(
     new StreamSource(
        new ByteArrayInputStream(new String(c2).getBytes())
     ), 
     new StreamResult(outputxml)
 );

任何帮助表示赞赏

4

1 回答 1

0

撇开($...)vs.{$...}错字不说,这行不通,因为xmlns它不是属性,而是命名空间声明。

不是属性,文字结果元素中的命名空间声明被视为属性值模板,您不能使用<xsl:attribute>. 但是由于您显然使用的是 XSLT 2.0,因此您可以使用<xsl:namespace>

<xsl:template match="/">
  <xsl:variable name="var_main_namespace" select="array/data[@attribute=1][@value=1][@subvalue=1]" />
  <xsd:schema targetNamespace="{$var_main_namespace}" elementFormDefault="qualified">
    <xsl:namespace name="" select="$var_main_namespace" />
  </xsd:schema>
</xsl:template>

为此,您提供的默认 Java 代码TransformerFactory需要支持 XSLT 2.0,例如 Saxon 9。

于 2013-11-11T18:49:54.150 回答