1

xsltで単純な「find-replace」を実行しようとしていますが、正しい出力を生成するのに問題があります。他の例に従おうとしましたが、残念ながらXSLTをあまり使用しておらず、やりたいことを実行する例を見つけることができませんでした。

私は次のXMLを持っています:

<metadata>
<Permissions>site:abcdefg-123456-id1::{azeckoski}h,S,r</Permissions>
<Permissions>site:hjklqwe-098765-id2::{person2}h,S,r</Permissions>
<Permissions>playlist:5678::{azeckoski}h,S,r</Permissions>
<Permissions>playlist:7890::{azeckoski}H,s,r</Permissions>
<Permissions>playlist:1234::{person1}H,s,R</Permissions>
</metadata>

そして、次のXSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:package="info:srw/extension/13/package-v1.0" >
<xsl:output omit-xml-declaration="yes" indent="no"/>
 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>
 <xsl:template match="metadata[starts-with(Permissions,'site:abcdefg-123456-id1::')]">
  <xsl:copy>
   <xsl:text>site:abcdefg-123456-id1::{azeckoski}H,S,R</xsl:text>
  </xsl:copy>
 </xsl:template>
</xsl:stylesheet>

最終的に次のXMLになります。

<metadata>
<Permissions>site:abcdefg-123456-id1::{azeckoski}H,S,R</Permissions>
<Permissions>site:hjklqwe-098765-id2::{person2}h,S,r</Permissions>
<Permissions>playlist:5678::{azeckoski}h,S,r</Permissions>
<Permissions>playlist:7890::{azeckoski}H,s,r</Permissions>
<Permissions>playlist:1234::{person1}H,s,R</Permissions>
</metadata>

しかし、私は代わりにこれで終わります:

<metadata>site:abcdefg-123456-id1::{azeckoski}H,S,R</metadata>

XMLドキュメントの残りの部分が消去されている理由がわかりません。IDテンプレートを使用して、他のすべてをそのまま保持していると思いました。

4

2 に答える 2

1

使用:

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

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

 <xsl:template match="Permissions/text()[starts-with(.,'site:abcdefg-123456-id1::')]">
  <xsl:text>site:abcdefg-123456-id1::{azeckoski}H,S,R</xsl:text>
 </xsl:template>
</xsl:stylesheet>

この変換が提供された XML ドキュメントに適用されると、次のようになります。

<metadata>
    <Permissions>site:abcdefg-123456-id1::{azeckoski}h,S,r</Permissions>
    <Permissions>site:hjklqwe-098765-id2::{person2}h,S,r</Permissions>
    <Permissions>playlist:5678::{azeckoski}h,S,r</Permissions>
    <Permissions>playlist:7890::{azeckoski}H,s,r</Permissions>
    <Permissions>playlist:1234::{person1}H,s,R</Permissions>
</metadata>

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

<metadata>
   <Permissions>site:abcdefg-123456-id1::{azeckoski}H,S,R</Permissions>
   <Permissions>site:hjklqwe-098765-id2::{person2}h,S,r</Permissions>
   <Permissions>playlist:5678::{azeckoski}h,S,r</Permissions>
   <Permissions>playlist:7890::{azeckoski}H,s,r</Permissions>
   <Permissions>playlist:1234::{person1}H,s,R</Permissions>
</metadata>

あなたの問題は、 の子を処理 (テンプレートを適用) しないことでしmetadataた。

于 2013-01-25T14:15:25.437 に答える
0

この関数は、node() ではなく、start-with() 最初の引数として文字列を想定しています。マッチ ルールが正しくありませんでした。そのはず :

<xsl:template match="metadata/Permissions[starts-with(./text(),'site:abcdefg-123456-id1::')]">
...
</xsl:template>

ここで、「site:abcdefg-123456-id1::」で始まるかどうかをテストした文字列はmetadata/Permissions/text().

于 2013-01-25T14:23:07.160 に答える