Java 使用XSLT编辑XML

Java 使用XSLT编辑XML,java,xml,xslt,xml-parsing,transform,Java,Xml,Xslt,Xml Parsing,Transform,想知道是否有人可以帮助解决我面临的XSLT问题 我正在尝试创建一个xslt脚本,该脚本将接受一个xml文档作为输入,并将多个字段的值更改为“xxxx”。我已设法使该部分正常工作,但我现在只希望在输入xml中的一个字段具有特定值时运行该脚本(例如,如果用户名为jbond) 如果可能的话,我希望在XSLT中有这个条件,但是我有困难 我当前的XML、XSLT、输出和预期输出如下 XML: 测试 12345 abcd XSLT: XXXX XXXX 输出: <?xml version="1

想知道是否有人可以帮助解决我面临的XSLT问题

我正在尝试创建一个xslt脚本,该脚本将接受一个xml文档作为输入,并将多个字段的值更改为“xxxx”。我已设法使该部分正常工作,但我现在只希望在输入xml中的一个字段具有特定值时运行该脚本(例如,如果用户名为jbond)

如果可能的话,我希望在XSLT中有这个条件,但是我有困难

我当前的XML、XSLT、输出和预期输出如下

XML:


测试
12345
abcd
XSLT:


XXXX
XXXX
输出:

<?xml version="1.0" encoding="UTF-8"?>
<rootDoc/>

预期:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl"?><rootDoc>
   <user>test</user>
   <tel>XXXX</tel>
   <zip>XXXX</zip>
</rootDoc>

测试
XXXX
XXXX

将测试放在身份转换模板中没有多大意义,如果您希望在条件成立时执行某些更改,则将测试放在模板中

<xsl:template match="tel/text()">XXXX</xsl:template>
<xsl:template match="zip/text()">XXXX</xsl:template>
XXXX
XXXX
应改为

<xsl:template match="rootDoc[user = 'test']/tel/text()">XXXX</xsl:template>
<xsl:template match="rootDoc[user = 'test']/zip/text()">XXXX</xsl:template>
XXXX
XXXX
可以加入

<xsl:template match="rootDoc[user = 'test']/tel/text() | rootDoc[user = 'test']/zip/text()">XXXX</xsl:template>
XXXX
对于单个条件,假设它是rootNode,您可以使用

<xsl:template match="/rootNode[not(user = 'test')]">
  <xsl:copy-of select="."/>
</xsl:template>


然后,其他情况由标识转换和专用模板处理。

如果不进行标识转换,而是添加特定的匹配项,XSLT将自动查找最接近的匹配项。您可以根据需要自定义select=”“或添加更多模板。嗯

    <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" >
    <xsl:output method="xml" omit-xml-declaration="no" indent="yes"/>

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

<xsl:template match="tel"><tel>XXXX</tel></xsl:template>
<xsl:template match="zip"><zip>XXXX</zip></xsl:template>

</xsl:stylesheet>

XXXX
XXXX

感谢您的回复,您是否知道是否可以有一个更通用的解决方案,只运行一次条件,而不是针对每个节点。在最终文档中,有几个字段需要清理,因此,我们尝试减少重复条件的数量。如果您知道如果条件不成立,您不想更改任何内容,那么您可以对根元素使用一个模板,它只是复制所有内容,而不是应用模板。测试w3.org/2005/xpath函数“>XXXX
<xsl:template match="/rootNode[not(user = 'test')]">
  <xsl:copy-of select="."/>
</xsl:template>
    <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" >
    <xsl:output method="xml" omit-xml-declaration="no" indent="yes"/>

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

<xsl:template match="tel"><tel>XXXX</tel></xsl:template>
<xsl:template match="zip"><zip>XXXX</zip></xsl:template>

</xsl:stylesheet>