1

我试图在 xslt 中做一个简单的“查找替换”,但无法让它产生正确的输出。我尝试学习其他示例,但不幸的是,我对 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 文档的其余部分。我以为我正在使用身份模板来保持其他所有内容不变。

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

该函数start-with() 需要一个字符串作为第一个参数,而不是 node()。您的匹配规则不正确。它应该是 :

<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 回答