当前位置: 首页 > 知识库问答 >
问题:

使用XSLT将模板应用于具有不同名称的子代

穆招
2023-03-14

我正在尝试为封装在父元素中但具有不同元素名称的元素使用应用模板。在我的示例中,我想将其应用于/作者/名称/元素,并选择其中任何一个具有值。此任务是我问的另一个问题的延续。我使用以下XML

<?xml version="1.0" encoding="UTF-8"?>
<Author>
<Info>
     <Name>
         <FirstName>#3     bb***</FirstName>
        <LastName>test</LastName>
     </Name>
    <Input>
        <Item>##### 3     ??***</Item>
    </Input>
</Info>
<Custom>Test</Custom>
</Author>

我正在使用java应用以下XSLT 1.0。在上面的示例中,我希望模板应用于firstName和lastName,但在firstName中显示值,因为它是第一个有值的。

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:variable name="allowed-start-chars">abcdefghijklmnopqrstuvwxyz</xsl:variable>
    <xsl:variable name="allowed-follow-chars">0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ ?abcdefghijklmnopqrstuvwxyz-&apos;.,/@&amp;()!+</xsl:variable>

    <xsl:template match="/">
        <html>
            <body>
             <!-- Not sure how to use `xsl:choose` just added to show my intentions-->
   <xsl:choose>
      <xsl:when test="..">
                <div>
                    <xsl:apply-templates  select="Author/Name/FirstName"/>
                </div>
     </xsl:when>
  </xsl:choose>
            </body>
        </html>
    </xsl:template>
   <!--used pipe to apply for two different elements but it does not work-->
    <xsl:template match="FirstName|LastName">
        <!-- find the first character eligible to be starting character -->
        <xsl:variable name="start-chars" select="translate(., translate(., $allowed-start-chars, ''), '')"/>
        <xsl:variable name="start-char" select="substring($start-chars, 1, 1)"/>
        <!-- get text after the chosen starting character -->
        <xsl:variable name="tail" select="substring-after(., $start-char)"/>
        <!-- remove unwanted characters from tail -->
        <xsl:variable name="fo" select="translate($tail, translate($tail, $allowed-follow-chars, ''), '')"/>        <xsl:choose>
            <!--only show if character remain after removing bad ones, and not empty-->
            <xsl:when test="string-length($start-char) &gt; 0 and normalize-space(concat($start-char, $fo))">
                <xsl:value-of select="normalize-space(concat($start-char, $fo))"/>
            </xsl:when>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

Java代码是Oracle tuorial页面示例中的Stylezer类,请参考链接以获取完整代码。我正在运行命令行发送xml和xslt文件。

   File stylesheet = new File(argv[0]);
            File datafile = new File(argv[1]);

            DocumentBuilder builder = factory.newDocumentBuilder();
            document = builder.parse(datafile);

            // Use a Transformer for output
            TransformerFactory tFactory = TransformerFactory.newInstance();
            StreamSource stylesource = new StreamSource(stylesheet);
            Transformer transformer = tFactory.newTransformer(stylesource);

            DOMSource source = new DOMSource(document);
            StreamResult result = new StreamResult(System.out);
            transformer.transform(source, result);

我将再次感谢您的帮助。在我学习XSLT的过程中,我也不确定使用这种方法会出现什么性能问题

共有1个答案

黄彬
2023-03-14

根据以下内容:

<xsl:template match="/">

你可以做:

<xsl:apply-templates select="(Author/Info/Name/FirstName | Author/Info/Name/LastName)[text()][1]"/>

选择两个元素中具有子文本节点的第一个元素。如果只有名字和姓氏,可以将其缩短为:

<xsl:apply-templates select="Author/Info/Name/*[text()][1]"/>

请注意,您的尝试:

<xsl:apply-templates  select="Author/Name/FirstName"/>

无法工作,因为名称不是作者的子级。

 类似资料:
  • 我有以下xml文件结构: 我的目标是借助xslt文件生成html输出。在这样做的过程中,我想应用一个模板来指导根元素的子元素,该元素将标记的名称输出为标题1,其内容包含在 为了更容易理解我想要的是HTML输出的示例: 现在,我的尝试如下所示:http://pastebin.com/wKgSLbcE 但它不适用于

  • 我正在使用XML构建调查。调查中的一个(矩阵)问题,具有列和行,如下所示: 我想使用不同的XSLT模板,这取决于 节点。因此,尽管所有问题都是以相同的方式构建的,但它们看起来可能不同。我想用不同的。每个问题类型的XSLT文件,定义问题、列和行的外观。 如果我使用以下代码包括“模块/模板”: 该模板包含问题、行和列的格式定义。如果同一页面上有不同类型的问题,会不会出现干扰,因为定义每种类型的问题、行

  • 如果我们说为特定节点应用模板,那么它将应用于整个xml中,无论它在哪里找到该节点/标记。 我的问题是我有一个xml,我需要根据条件应用模板,基本上保持一些秩序。 输入xml: 输出应为, 我的XSLT是这样的, 需要根据以下条件重新构造XSL, 我只想在注释不是作为表的前兄弟或后兄弟出现时应用注释模板。如果它在表的后面或前面,那么它应该位于表之间、表的下面或上面,就像在输出中一样。 谢啦

  • 问题内容: 我有一个像这样的POJO,我正在使用GSON序列化为JSON: 这是我的做法: 现在我的json将是这样的: 现在我的问题是:有什么办法可以代替更改变量名呢?在Gson中,我可以在变量顶部使用任何注释吗? 我想要这样的东西: 问题答案: 您可以使用@SerializedName(“ client_id”) 编辑: 您也可以使用它,以通用方式更改所有字段

  • 根据xslt中的变量应用模板的最佳方法是什么?变量将通过java脚本代码更改。我已经阅读了xslt v 2.0中的函数,但答案解释得不是很好,也不符合我的要求 我尝试了下一个: 我创建了一个全局变量 然后像这样应用 然后像这样匹配 但没有显示任何内容。

  • 我对XML/XSLT非常陌生,很难理解通过根-子节点和子节点的中心节点的循环。 例如,我有一个链接到XSL文件的XML文件,在该XML文件中有几个包含decentant的子节点。见下文 我知道这里的层次结构是学生/校友/模/模1或模2,但当我想在XSL中循环它们时,我可以一直循环到学生/校友,或者如果我选择学生/校友/模,我可以循环到模,但我丢失了校友中的信息(姓名等),我理解这是预期的,因为我在