Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Templates xsl:fo模板匹配未在嵌套列表上触发_Templates_Xslt_Xsl Fo - Fatal编程技术网

Templates xsl:fo模板匹配未在嵌套列表上触发

Templates xsl:fo模板匹配未在嵌套列表上触发,templates,xslt,xsl-fo,Templates,Xslt,Xsl Fo,我需要在应用xsl:fo的嵌套列表中为项目符号使用连字符。我有两个模板要匹配,但只应用了一个。如果只使用第一个模板,则外部列表将应用该模板。如果只使用第二个模板,嵌套列表将应用该模板。我试图在第二个模板中匹配的模式是任何无序列表,其中列表项作为父项。非常感谢您对我所需输出的任何帮助 XML <ThisNode> <ul> <li>Item One</li> <li>Item Two</li> <

我需要在应用xsl:fo的嵌套列表中为项目符号使用连字符。我有两个模板要匹配,但只应用了一个。如果只使用第一个模板,则外部列表将应用该模板。如果只使用第二个模板,嵌套列表将应用该模板。我试图在第二个模板中匹配的模式是任何无序列表,其中列表项作为父项。非常感谢您对我所需输出的任何帮助

XML

<ThisNode>
<ul>
    <li>Item One</li>
    <li>Item Two</li>
    <li>Item Three
        <ul>
            <li>Sub-Item One</li>
            <li>Sub-Item Two</li>
        </ul>
    </li>
    <li>Item Four</li>
    <li>Item Five</li>
</ul>
</ThisNode>
仅使用第一个模板或同时使用两个模板的实际输出

• Item One
• Item Two
• Item ThreeSub-Item OneSub-Item Two
• Item Four
• Item Five
仅使用第二个模板的实际输出

Item One Item Two Item Three
    - Sub-Item One
    - Sub-Item Two
Item Four Item Five

这看起来是使用
模式的
调用模板
区分这两种情况的好地方。外部模板调用内部模板:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">

   <xsl:template match="/">
      <fo:block text-align="left">
         <xsl:apply-templates select="ThisNode"/>
      </fo:block>
   </xsl:template>


   <xsl:template match="ul">
      <fo:list-block>
         <xsl:for-each select="li">
            <fo:list-item>
               <fo:list-item-label end-indent="label-end()">
                  <fo:block font-weight="bold">•</fo:block>
               </fo:list-item-label>
               <fo:list-item-body start-indent="8pt">
                  <fo:block>
                     <!-- I'm not quite sure what you want here -->
                     <xsl:value-of select="text()"/>
                     <xsl:apply-templates select="ul" mode="inner"/>
                  </fo:block>
               </fo:list-item-body>
            </fo:list-item>
         </xsl:for-each>
      </fo:list-block>
   </xsl:template>

   <xsl:template match="ul" mode="inner">
      <fo:list-block start-indent="8pt">
         <xsl:for-each select="./li">
            <fo:list-item>
               <fo:list-item-label end-indent="label-end()">
                  <fo:block font-weight="bold">-</fo:block>
               </fo:list-item-label>
               <fo:list-item-body start-indent="16pt">
                  <fo:block>
                     <xsl:value-of select="."/>
                  </fo:block>
               </fo:list-item-body>
            </fo:list-item>
         </xsl:for-each>
      </fo:list-block>
   </xsl:template>

</xsl:stylesheet>

•
-

这看起来是一个很好的地方,可以使用
模式的
呼叫模板
,来区分这两种情况。外部模板调用内部模板:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">

   <xsl:template match="/">
      <fo:block text-align="left">
         <xsl:apply-templates select="ThisNode"/>
      </fo:block>
   </xsl:template>


   <xsl:template match="ul">
      <fo:list-block>
         <xsl:for-each select="li">
            <fo:list-item>
               <fo:list-item-label end-indent="label-end()">
                  <fo:block font-weight="bold">•</fo:block>
               </fo:list-item-label>
               <fo:list-item-body start-indent="8pt">
                  <fo:block>
                     <!-- I'm not quite sure what you want here -->
                     <xsl:value-of select="text()"/>
                     <xsl:apply-templates select="ul" mode="inner"/>
                  </fo:block>
               </fo:list-item-body>
            </fo:list-item>
         </xsl:for-each>
      </fo:list-block>
   </xsl:template>

   <xsl:template match="ul" mode="inner">
      <fo:list-block start-indent="8pt">
         <xsl:for-each select="./li">
            <fo:list-item>
               <fo:list-item-label end-indent="label-end()">
                  <fo:block font-weight="bold">-</fo:block>
               </fo:list-item-label>
               <fo:list-item-body start-indent="16pt">
                  <fo:block>
                     <xsl:value-of select="."/>
                  </fo:block>
               </fo:list-item-body>
            </fo:list-item>
         </xsl:for-each>
      </fo:list-block>
   </xsl:template>

</xsl:stylesheet>

•
-

以下样式表说明了一种可能的解决方案。您的方法并不遥远——但是,它没有考虑XSLT处理器的行为。这句话:

<xsl:value-of select="."/>
检索
li
元素的文本内容,并
处理作为其子项的
li
元素

正如你的标题所说

xsl:fo模板匹配未在嵌套列表上触发

你诊断对了。这是因为-一旦在与
li
匹配的模板中-就不允许XSLT处理器处理
li
元素的后代

样式表

<?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">

   <xsl:output method="xml" indent="yes"/>

   <xsl:template match="/ThisNode">
      <fo:root>
         <fo:layout-master-set>
            <fo:simple-page-master master-name="simple"
                              page-height="29.7cm"
                              page-width="21cm"
                              margin-top="1cm"
                              margin-bottom="2cm"
                              margin-left="2.5cm"
                              margin-right="2.5cm">
               <fo:region-body margin-top="3cm"/>
               <fo:region-before extent="3cm"/>
               <fo:region-after extent="1.5cm"/>
            </fo:simple-page-master>
         </fo:layout-master-set>

         <fo:page-sequence master-reference="simple">
            <fo:flow flow-name="xsl-region-body">
               <xsl:apply-templates/>
            </fo:flow>
         </fo:page-sequence>
      </fo:root>
   </xsl:template>

   <xsl:template match="ul[parent::ThisNode]">
      <fo:list-block>
         <xsl:apply-templates/>
      </fo:list-block>
   </xsl:template>

   <xsl:template match="ul[parent::li]">
         <xsl:apply-templates/>
   </xsl:template>

   <xsl:template match="li">
      <fo:list-item>
         <xsl:choose>
            <xsl:when test="parent::ul/parent::ThisNode">
                <fo:list-item-label start-indent="1cm">
                   <fo:block font-weight="bold">&#x2022;</fo:block>
                </fo:list-item-label>
                <fo:list-item-body start-indent="1.5cm">
                   <fo:block><xsl:value-of select="child::text()"/></fo:block>
                </fo:list-item-body>
            </xsl:when>
            <xsl:otherwise>
                <fo:list-item-label start-indent="3cm">
                   <fo:block font-weight="bold">-</fo:block>
                </fo:list-item-label>
                <fo:list-item-body start-indent="3.5cm">
                   <fo:block><xsl:value-of select="."/></fo:block>
                </fo:list-item-body>
            </xsl:otherwise>
         </xsl:choose>  
      </fo:list-item>
      <xsl:apply-templates/>
   </xsl:template>

</xsl:stylesheet>

•;
-
输出(XSL-FO)


•
项目一
项目一
•
项目二
项目二
•
项目三
项目三
-
分项目一
分项目一
-
分项目二
分项目二
•
项目四
项目四
•
项目五
项目五
输出(PDF)


下面的样式表说明了一种可能的解决方案。您的方法并不遥远——但是,它没有考虑XSLT处理器的行为。这句话:

<xsl:value-of select="."/>
检索
li
元素的文本内容,并
处理作为其子项的
li
元素

正如你的标题所说

xsl:fo模板匹配未在嵌套列表上触发

你诊断对了。这是因为-一旦在与
li
匹配的模板中-就不允许XSLT处理器处理
li
元素的后代

样式表

<?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">

   <xsl:output method="xml" indent="yes"/>

   <xsl:template match="/ThisNode">
      <fo:root>
         <fo:layout-master-set>
            <fo:simple-page-master master-name="simple"
                              page-height="29.7cm"
                              page-width="21cm"
                              margin-top="1cm"
                              margin-bottom="2cm"
                              margin-left="2.5cm"
                              margin-right="2.5cm">
               <fo:region-body margin-top="3cm"/>
               <fo:region-before extent="3cm"/>
               <fo:region-after extent="1.5cm"/>
            </fo:simple-page-master>
         </fo:layout-master-set>

         <fo:page-sequence master-reference="simple">
            <fo:flow flow-name="xsl-region-body">
               <xsl:apply-templates/>
            </fo:flow>
         </fo:page-sequence>
      </fo:root>
   </xsl:template>

   <xsl:template match="ul[parent::ThisNode]">
      <fo:list-block>
         <xsl:apply-templates/>
      </fo:list-block>
   </xsl:template>

   <xsl:template match="ul[parent::li]">
         <xsl:apply-templates/>
   </xsl:template>

   <xsl:template match="li">
      <fo:list-item>
         <xsl:choose>
            <xsl:when test="parent::ul/parent::ThisNode">
                <fo:list-item-label start-indent="1cm">
                   <fo:block font-weight="bold">&#x2022;</fo:block>
                </fo:list-item-label>
                <fo:list-item-body start-indent="1.5cm">
                   <fo:block><xsl:value-of select="child::text()"/></fo:block>
                </fo:list-item-body>
            </xsl:when>
            <xsl:otherwise>
                <fo:list-item-label start-indent="3cm">
                   <fo:block font-weight="bold">-</fo:block>
                </fo:list-item-label>
                <fo:list-item-body start-indent="3.5cm">
                   <fo:block><xsl:value-of select="."/></fo:block>
                </fo:list-item-body>
            </xsl:otherwise>
         </xsl:choose>  
      </fo:list-item>
      <xsl:apply-templates/>
   </xsl:template>

</xsl:stylesheet>

•;
-
输出(XSL-FO)


•
项目一
项目一
<?xml version="1.0" encoding="UTF-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
   <fo:layout-master-set>
      <fo:simple-page-master master-name="simple" page-height="29.7cm" page-width="21cm" margin-top="1cm"
                             margin-bottom="2cm"
                             margin-left="2.5cm"
                             margin-right="2.5cm">
         <fo:region-body margin-top="3cm"/>
         <fo:region-before extent="3cm"/>
         <fo:region-after extent="1.5cm"/>
      </fo:simple-page-master>
   </fo:layout-master-set>
   <fo:page-sequence master-reference="simple">
      <fo:flow flow-name="xsl-region-body">
         <fo:list-block>
            <fo:list-item>
               <fo:list-item-label start-indent="1cm">
                  <fo:block font-weight="bold">•</fo:block>
               </fo:list-item-label>
               <fo:list-item-body start-indent="1.5cm">
                  <fo:block>Item One</fo:block>
               </fo:list-item-body>
            </fo:list-item>Item One
    <fo:list-item>
               <fo:list-item-label start-indent="1cm">
                  <fo:block font-weight="bold">•</fo:block>
               </fo:list-item-label>
               <fo:list-item-body start-indent="1.5cm">
                  <fo:block>Item Two</fo:block>
               </fo:list-item-body>
            </fo:list-item>Item Two
    <fo:list-item>
               <fo:list-item-label start-indent="1cm">
                  <fo:block font-weight="bold">•</fo:block>
               </fo:list-item-label>
               <fo:list-item-body start-indent="1.5cm">
                  <fo:block>Item Three

    </fo:block>
               </fo:list-item-body>
            </fo:list-item>Item Three

            <fo:list-item>
               <fo:list-item-label start-indent="3cm">
                  <fo:block font-weight="bold">-</fo:block>
               </fo:list-item-label>
               <fo:list-item-body start-indent="3.5cm">
                  <fo:block>Sub-Item One</fo:block>
               </fo:list-item-body>
            </fo:list-item>Sub-Item One
            <fo:list-item>
               <fo:list-item-label start-indent="3cm">
                  <fo:block font-weight="bold">-</fo:block>
               </fo:list-item-label>
               <fo:list-item-body start-indent="3.5cm">
                  <fo:block>Sub-Item Two</fo:block>
               </fo:list-item-body>
            </fo:list-item>Sub-Item Two


    <fo:list-item>
               <fo:list-item-label start-indent="1cm">
                  <fo:block font-weight="bold">•</fo:block>
               </fo:list-item-label>
               <fo:list-item-body start-indent="1.5cm">
                  <fo:block>Item Four</fo:block>
               </fo:list-item-body>
            </fo:list-item>Item Four
    <fo:list-item>
               <fo:list-item-label start-indent="1cm">
                  <fo:block font-weight="bold">•</fo:block>
               </fo:list-item-label>
               <fo:list-item-body start-indent="1.5cm">
                  <fo:block>Item Five</fo:block>
               </fo:list-item-body>
            </fo:list-item>Item Five
</fo:list-block>
      </fo:flow>
   </fo:page-sequence>
</fo:root>