Копировать только повторяющиеся узлы, когда любой из n-го повторяющегося дочернего элемента содержит дату позже, чем сегодня - PullRequest
0 голосов
/ 31 августа 2018

Я хочу отфильтровать входящий XML-документ, чтобы сохранить только те записи, содержащие дату позже, чем сегодня, на некотором повторяющемся n-м дочернем узле. Я пытался использовать шаблон идентификации с шаблоном, чтобы сопоставлять только те записи с предикатом в сопоставлении, но, похоже, я не могу получить правильный предикат, если это вообще возможно.

Пример ввода:

<?xml version="1.0" encoding="utf-8"?>
<Example>
    <Header>
        <ElementA/>
        <ElementB/>
    </Header>
    <Records>   
        <Record>    
            <Person>    
                <ElementC>1</ElementC>
            </Person>
            <Employers> 
                <Employer>  
                    <Identification>
                        <ElementD/>
                        <ElementE/>
                    </Identification>
                </Employer>
            </Employers>
        </Record>
        <Record>    
            <Person>    
                <ElementC>2</ElementC>
            </Person>
            <Employers> 
                <Employer>  
                    <Identification>
                        <ElementD/>
                        <ElementE/>
                    </Identification>
                    <History> 
                        <HistoryRecord>
                            <Period>
                                <Date>2017-08-01</Date>
                            </Period>
                        </HistoryRecord>
                        <HistoryRecord>
                            <Period>
                                <Date>2017-08-01</Date>
                            </Period>
                            <Period>
                                <Date>2018-10-01</Date>
                            </Period>
                        </HistoryRecord>
                    </History>
                </Employer>
            </Employers>
        </Record>
        <Record>    
            <Person>    
                <ElementC>3</ElementC>
            </Person>
            <Employers> 
                <Employer>  
                    <Identification>
                        <ElementD/>
                        <ElementE/>
                    </Identification>
                    <History> 
                        <HistoryRecord>
                            <Period>
                                <Date>2017-11-01</Date>
                            </Period>
                        </HistoryRecord>
                    </History>
                </Employer>
            </Employers>
        </Record>
        <Record>    
            <Person>    
                <ElementC>4</ElementC>
            </Person>
            <Employers> 
                <Employer>  
                    <Identification>
                        <ElementD/>
                        <ElementE/>
                    </Identification>
                    <History> 
                        <HistoryRecord>
                            <Period>
                                <Date>2018-11-01</Date>
                            </Period>
                        </HistoryRecord>
                    </History>
                </Employer>
            </Employers>
        </Record>
    </Records>
</Example>

Требуется вывод:

 <?xml version="1.0" encoding="utf-8"?>
<Example>
    <Header>
        <ElementA/>
        <ElementB/>
    </Header>
    <Records>   
            <Person>    
                <ElementC>2</ElementC>
            </Person>
            <Employers> 
                <Employer>  
                    <Identification>
                        <ElementD/>
                        <ElementE/>
                    </Identification>
                    <History> 
                        <HistoryRecord>
                            <Period>
                                <Date>2017-08-01</Date>
                            </Period>
                        </HistoryRecord>
                        <HistoryRecord>
                            <Period>
                                <Date>2017-08-01</Date>
                            </Period>
                            <Period>
                                <Date>2018-10-01</Date>
                            </Period>
                        </HistoryRecord>
                    </History>
                </Employer>
            </Employers>
        </Record>
        <Record>    
            <Person>    
                <ElementC>4</ElementC>
            </Person>
            <Employers> 
                <Employer>  
                    <Identification>
                        <ElementD/>
                        <ElementE/>
                    </Identification>
                    <History> 
                        <HistoryRecord>
                            <Period>
                                <Date>2018-11-01</Date>
                            </Period>
                        </HistoryRecord>
                    </History>
                </Employer>
            </Employers>
        </Record>
    </Records>
</Example>

1 Ответ

0 голосов
/ 06 сентября 2018
<!-- Get today's date somehow -->
<xsl:variable name="todaysDate" select="'2018-09-06'"/>

<!--  You need the identity template -->
<xsl:template match="node()|@*">
   <xsl:apply-templates select="node()|@*"/>
</xsl:template>

<xsl:template match="Record">
  <!-- Since your date is in the yyyy-mm-dd format, you can do a text compare.  -->
  <xsl:if test=".//Date[. &gt; $todaysDate][1]">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:if>
</xsl:template>
...