1

いくつかのxml値を置き換えることができるxslテンプレートがあります。ここで、これらの値をコードによって動的に生成する必要があります。

Transformer trans = TransformerFactory.newInstance().newTransformer(new StreamSource(new File("foo.xsl"));
trans.transform(new StreamSource(new File("foo.xml"), new StreamResult(new File("output.xml")));

id = 1の場合にのみ名前を置き換えるなど、どうすれば取得できますか?さらに、ハードコードされていないjavacodeによって動的にそのIDを提供しますか?

<?xml version="1.0"?>
<my:accounts xmlns:my="http://myns">
<my:account>
<my:name>alex</my:name>
<my:id>1</my:id>
</my:account>
<my:account>
<my:name>Fiona</my:name>
<my:id>2</my:id>
</my:account>
</my:accounts>

これにより、すべての名前が置き換えられます。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:my="http://myns">

 <xsl:param name="propertyName" select="'alex'"/>

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

<xsl:template match="*[local-name()='account']/*[local-name()='name']/text()[.='{$propertyName}']">
       <xsl:text>johndoe</xsl:text>
      </xsl:template>
    </xsl:stylesheet>
4

2 に答える 2

2

この変換:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:my="http://myns">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:param name="pId" select="2"/>

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

 <xsl:template match="my:name/text()">
   <xsl:choose>
     <xsl:when test="../../my:id = $pId">johndoe</xsl:when>
     <xsl:otherwise><xsl:copy-of select="."/></xsl:otherwise>
   </xsl:choose>
 </xsl:template>
</xsl:stylesheet>

提供された XML ドキュメントに適用した場合:

<my:accounts xmlns:my="http://myns">
    <my:account>
        <my:name>alex</my:name>
        <my:id>1</my:id>
    </my:account>
    <my:account>
        <my:name>Fiona</my:name>
        <my:id>2</my:id>
    </my:account>
</my:accounts>

必要な正しい結果が生成されます

<my:accounts xmlns:my="http://myns">
   <my:account>
      <my:name>alex</my:name>
      <my:id>1</my:id>
   </my:account>
   <my:account>
      <my:name>johndoe</my:name>
      <my:id>2</my:id>
   </my:account>
</my:accounts>

説明:

  1. global-scope の使用<xsl:param>。デフォルト値が設定されていますが、これは変換の呼び出し元によって指定された値によってオーバーライドされます。

  2. 外部パラメータの値を変換に指定する方法についての質問には、異なる xslt プロセッサ (ベンダー) に対して異なる答えがあることに注意してください。特定のケースでこの回答を得るには、使用している特定の XSLT プロセッサのドキュメントを読む必要があります。

于 2012-12-05T14:00:19.273 に答える
0

xsl スタイルシートでパラメーターを定義できます

<xsl:param name="id" select="'0'"/>

そして、それを Java のパラメータとして渡します。

trans.setParameter("id", "1");

それはあなたのために働くでしょうか?それとも複数のパラメータを渡したいですか?

ここで参照されているもののようなもの- トランスフォーマークラス

このxslは機能しますが、2.0にあります

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:my="http://myns">
<xsl:param name="id" select="'1'"/>

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

<xsl:template match="*[local-name()='account'][*:id=$id]/*[local-name()='name']/text()">
   <xsl:text>johndoe</xsl:text>
  </xsl:template>
</xsl:stylesheet>
于 2012-12-05T13:46:37.910 に答える