如何在 XSLT 中检测有效负载中的特定字符串

How to detect a certain string in a payload in XSLT

我想根据 XSLT(使用 Xpath 2.0)中的有效负载信息进行一些图像检测。我发现我希望检测的所有格式的图像在有效负载中都以字符“jP”或“OQ”开头。当元素包含子字符串“JP”或“OQ”作为元素中的第一个字符时,我想创建一个新元素 yes 或类似的东西,基于它我的信息流(Oracle SOA 套件 12c)将走向某个方向.下面是我的有效负载和当前 XSLT 的示例。我的问题是为什么我的 XSLT 还不能运行,如果你不处理我的主题。

我的负载看起来像这样:

             <ns3:BlablablaExample>
                <ns3:Attachments>
                   <ns3:Images>
                      <ns3:Image>
                         <ns3:AttachmentID>11223344</ns3:AttachmentID>
                         <ns3:MetaData>
                            <ns3:OriginalTimestamp>2020-11-10T10:52:07.539Z</ns3:OriginalTimestamp>
                            <ns3:CreationTimestamp>2020-11-10T10:52:07.539Z</ns3:CreationTimestamp>
                         </ns3:MetaData>
                         <ns3:DataSource>jPRandOmD4t4AndSTu77/9j/4AAQSkZJRgABAQAAAQABAAD/5QAJSWRlbnRpeP/bAEMABgQFBgUEBgYFBgcHBggKEAoKCQkKFA4PDBAXFBgYFxQWFhodJR8aGyMcFhYgLCAjJicpKikZHy0wLSgwJSgpKP/bAEMBBwcHCggKEwoKEygaFhooKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCullullkokKoKokokCgoKCgoKCgoKCgoKP/AABEIAoAB4AMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h4xxF0R3alOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPEigAooooAKKKKACiiigAooooAKKKKACiiigAooo))))0000oo)oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo))oo)))000oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP//Z</ns3:DataSource>
                      </ns3:Image>
                   </ns3:Images>
                </ns3:Attachments>
             </ns3:BlablablaExample>

我想我的 XSLT 看起来像这样:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
                xmlns:xp20="http://www.oracle.com/XSL/Transform/java/oracle.tip.pc.services.functions.Xpath20"
                xmlns:ns3="http://www.randomnamespace.com/example/awesomestuff">
    <xsl:output method="xml" indent="yes" encoding="UTF-8"/>
    <xsl:template match="text()"/>
        <xsl:for-each select="ns3:BlablablaExample/ns3:Attachments/ns3:Images/ns3:Image">
            <xsl:choose>
                    <xsl:when test="substring(/ns3:DataSource,1,2)" == "jP" || "OQ">
                        <JPEG2000>Yes</JPEG2000>
                    </xsl:when>
                    <xsl:otherwise>
                        <JPEG2000>No</JPEG2000>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:element>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

但是,正如我提到的,xslt 不起作用。 我的问题是,上面的 XSLT 有什么问题,您认为您可能会如何解决这个问题? :)

谢谢!

杰斯珀

"My question is, what is wrong with the above XSLT"

您的 XSLT 示例有太多问题,以至于很难知道从哪里开始。它在语法上是无效的 XML。它在语义上是无效的 XSLT。它包含无效的 XPath。 XPath 没有 || 运算符,即使有,构造 if x is a or b 也意味着 "if x is a or x is b" 在几乎没有任何编程语言中存在。还有一些其他的事情,但我想这已经有点太字面意思了。

你打算写这样的东西:

<xsl:stylesheet version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xp20="http://www.oracle.com/XSL/Transform/java/oracle.tip.pc.services.functions.Xpath20"
  xmlns:ns3="http://www.randomnamespace.com/example/awesomestuff"
>
  <xsl:output method="xml" indent="yes" encoding="UTF-8"/>

  <xsl:template match="ns3:Image">
    <JPEG2000>
      <xsl:choose>
        <xsl:when test="substring(ns3:DataSource,1,2) = ('jP','OQ')">Yes</xsl:when>
        <xsl:otherwise>No</xsl:otherwise>
      </xsl:choose>
    </JPEG2000>
  </xsl:template>
</xsl:stylesheet>